当用户用鼠标或方向键改变当前行位置时,我希望在改变前先判断另外2个DataGridView中的数据是否已被用户修改,如果修改了则弹出提示对话框,让用户选择是否保存数据,若用户选择“取消”则不保存并且不变换行位置,选择“是”或“否”则保存或不保存数据并允许选择至新行。
所以我希望有个行位置改变前的事件,以实现这种功能。但发现并没有这个事件,只有RowLeave和RowEnter事件,这2个都是发生后的事件,并不是发生前的事件。
18 个解决方案
#1
补充:
DataGridView绑定了强类型BindingSource绑定源,BindingSource绑定源的PositionChanged事件实现当行位置改变时检索填充符合条件的数据至另2个DataGridView。
PositionChanged事件也是发生后的事件,要是有个ing发生前的事件就好处理,可惜我一直没找到。
DataGridView绑定了强类型BindingSource绑定源,BindingSource绑定源的PositionChanged事件实现当行位置改变时检索填充符合条件的数据至另2个DataGridView。
PositionChanged事件也是发生后的事件,要是有个ing发生前的事件就好处理,可惜我一直没找到。
#2
我想
可以在数据源绑定之后进行操作噢。。我也不是太清楚。。。我想想吧。。。
可以在数据源绑定之后进行操作噢。。我也不是太清楚。。。我想想吧。。。
#3
有一个databound事件。。。可以开启一个检测。。
#4
行位置:SelectionChanged 里面加响应函数比较好
数据改变:CellValueChanged事件
双剑鹤壁,应该没有问题吧?
数据改变:CellValueChanged事件
双剑鹤壁,应该没有问题吧?
#5
你可以参考使用如下的事件:
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (MessageBox.Show("aaa", "bbb", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
e.Cancel = true;
}
}
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (MessageBox.Show("aaa", "bbb", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
e.Cancel = true;
}
}
#6
这个问题我也遇到过,我现在加了一个群,这个群人气较好,也的确有高手,不但可以交流问题,而且还可以接项目赚钱,QQ群号是:六#四#七#九#八#七#五#五,不要说 我做广告,看看便知,如需要的话加入试试,如果你发现好的交流群也别忘了告诉我啊!呵呵!
#7
mark
#8
#9
同意!
我以前就用这两个
#10
“marquess”能不能说得详细一点?
#11
应该是说各个事件都是光标离开,但是未进入新row的时候响应的,所以你可以在离开的时候判断,然后判断完了也许光标到新行了,但是可以再写函数回到原来行,rowselected就行吧,或者自己定义 System.Windows.Forms.SendKeys.Send("{up}");
#12
正在离开焦点的时候不可以再改变焦点,所以选择新行的时候又回到原行不可以。
#13
我的Form界面是左边有一个DataGridView,右边是用户输入的详细资料(有许多的TextBox控件),右边详细数据是根据左边DataGridView中的当前行条件来检索填充。当用户在右边输入或修改了详细资料后,没有保存就点击了左边DataGridView中的其它行,所以弹出提示保存对话框,如果用户点击“是”或“否”则“保存”或“不保存”并允许选择至其它行,如果用户点击“取消”,则不保存也不允许选择至其它行,DataGridView必须从其它行回到原行位置,现在问题是选择了其它行后,即使点了“取消”也回不来原行位置。
#14
只有想到记录上一次的RowIndex的方法,关注达人方法
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (!dataGridView2.data_changed)
{
lastrow = e.RowIndex;
}
else
{
MessageBox.Show("dataGridView2_datachanged……");
dataGridView1.ClearSelection();
dataGridView1.Rows[lastrow].Selected = true;
}
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (!dataGridView2.data_changed)
{
lastrow = e.RowIndex;
}
else
{
MessageBox.Show("dataGridView2_datachanged……");
dataGridView1.ClearSelection();
dataGridView1.Rows[lastrow].Selected = true;
}
}
#15
geniusatm4这种方式是不行的。如果用户用上下方向键或翻页键改变DataGridView行位置时怎么办呢?还有如果改变了绑定源BindingSource的Position值也会改变DataGridView的行位置,还有就是点工具栏的“第一条、上一条、下一条、最后条”时也会改变DataGridView的行位置。
我知道如果用最笨的方法如:按键控制、鼠标控制、工具栏的“第一条、上一条、下一条、最后条”也控制、所有让Position值改变的地方都控制等,这样是可以实现这种功能,但这样实在太费周折了,也不科学不好维护,如果有上百个Form都要这样做,那就麻烦了。
所以如果有个绑定源BindingSource的Position值改变前ing的事件那就好统一管理和控制了,允许则改变Position值,不允许则Position值保持不变,当然DataGridView的当前行也要保持不变。
我知道如果用最笨的方法如:按键控制、鼠标控制、工具栏的“第一条、上一条、下一条、最后条”也控制、所有让Position值改变的地方都控制等,这样是可以实现这种功能,但这样实在太费周折了,也不科学不好维护,如果有上百个Form都要这样做,那就麻烦了。
所以如果有个绑定源BindingSource的Position值改变前ing的事件那就好统一管理和控制了,允许则改变Position值,不允许则Position值保持不变,当然DataGridView的当前行也要保持不变。
#16
我的这个问题的界面图:
#17
怎么放图片呀?
#18
终于想了个办法:
private void DataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
DataRowView _dview = (DataRowView)this.BindingContext[this.EditDataSet,
this.DataMember].Current;
_dview.EndEdit();
if (this.EditDataSet.HasChanges())
{
MessageBox.Show("数据已经 修改过,不能滚动");
e.Cancel = true;
}
}
我的QQ:249509209,有问题大家一起搞定.
private void DataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
DataRowView _dview = (DataRowView)this.BindingContext[this.EditDataSet,
this.DataMember].Current;
_dview.EndEdit();
if (this.EditDataSet.HasChanges())
{
MessageBox.Show("数据已经 修改过,不能滚动");
e.Cancel = true;
}
}
我的QQ:249509209,有问题大家一起搞定.
#1
补充:
DataGridView绑定了强类型BindingSource绑定源,BindingSource绑定源的PositionChanged事件实现当行位置改变时检索填充符合条件的数据至另2个DataGridView。
PositionChanged事件也是发生后的事件,要是有个ing发生前的事件就好处理,可惜我一直没找到。
DataGridView绑定了强类型BindingSource绑定源,BindingSource绑定源的PositionChanged事件实现当行位置改变时检索填充符合条件的数据至另2个DataGridView。
PositionChanged事件也是发生后的事件,要是有个ing发生前的事件就好处理,可惜我一直没找到。
#2
我想
可以在数据源绑定之后进行操作噢。。我也不是太清楚。。。我想想吧。。。
可以在数据源绑定之后进行操作噢。。我也不是太清楚。。。我想想吧。。。
#3
有一个databound事件。。。可以开启一个检测。。
#4
行位置:SelectionChanged 里面加响应函数比较好
数据改变:CellValueChanged事件
双剑鹤壁,应该没有问题吧?
数据改变:CellValueChanged事件
双剑鹤壁,应该没有问题吧?
#5
你可以参考使用如下的事件:
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (MessageBox.Show("aaa", "bbb", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
e.Cancel = true;
}
}
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
{
if (MessageBox.Show("aaa", "bbb", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
e.Cancel = true;
}
}
#6
这个问题我也遇到过,我现在加了一个群,这个群人气较好,也的确有高手,不但可以交流问题,而且还可以接项目赚钱,QQ群号是:六#四#七#九#八#七#五#五,不要说 我做广告,看看便知,如需要的话加入试试,如果你发现好的交流群也别忘了告诉我啊!呵呵!
#7
mark
#8
#9
同意!
我以前就用这两个
#10
“marquess”能不能说得详细一点?
#11
应该是说各个事件都是光标离开,但是未进入新row的时候响应的,所以你可以在离开的时候判断,然后判断完了也许光标到新行了,但是可以再写函数回到原来行,rowselected就行吧,或者自己定义 System.Windows.Forms.SendKeys.Send("{up}");
#12
正在离开焦点的时候不可以再改变焦点,所以选择新行的时候又回到原行不可以。
#13
我的Form界面是左边有一个DataGridView,右边是用户输入的详细资料(有许多的TextBox控件),右边详细数据是根据左边DataGridView中的当前行条件来检索填充。当用户在右边输入或修改了详细资料后,没有保存就点击了左边DataGridView中的其它行,所以弹出提示保存对话框,如果用户点击“是”或“否”则“保存”或“不保存”并允许选择至其它行,如果用户点击“取消”,则不保存也不允许选择至其它行,DataGridView必须从其它行回到原行位置,现在问题是选择了其它行后,即使点了“取消”也回不来原行位置。
#14
只有想到记录上一次的RowIndex的方法,关注达人方法
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (!dataGridView2.data_changed)
{
lastrow = e.RowIndex;
}
else
{
MessageBox.Show("dataGridView2_datachanged……");
dataGridView1.ClearSelection();
dataGridView1.Rows[lastrow].Selected = true;
}
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (!dataGridView2.data_changed)
{
lastrow = e.RowIndex;
}
else
{
MessageBox.Show("dataGridView2_datachanged……");
dataGridView1.ClearSelection();
dataGridView1.Rows[lastrow].Selected = true;
}
}
#15
geniusatm4这种方式是不行的。如果用户用上下方向键或翻页键改变DataGridView行位置时怎么办呢?还有如果改变了绑定源BindingSource的Position值也会改变DataGridView的行位置,还有就是点工具栏的“第一条、上一条、下一条、最后条”时也会改变DataGridView的行位置。
我知道如果用最笨的方法如:按键控制、鼠标控制、工具栏的“第一条、上一条、下一条、最后条”也控制、所有让Position值改变的地方都控制等,这样是可以实现这种功能,但这样实在太费周折了,也不科学不好维护,如果有上百个Form都要这样做,那就麻烦了。
所以如果有个绑定源BindingSource的Position值改变前ing的事件那就好统一管理和控制了,允许则改变Position值,不允许则Position值保持不变,当然DataGridView的当前行也要保持不变。
我知道如果用最笨的方法如:按键控制、鼠标控制、工具栏的“第一条、上一条、下一条、最后条”也控制、所有让Position值改变的地方都控制等,这样是可以实现这种功能,但这样实在太费周折了,也不科学不好维护,如果有上百个Form都要这样做,那就麻烦了。
所以如果有个绑定源BindingSource的Position值改变前ing的事件那就好统一管理和控制了,允许则改变Position值,不允许则Position值保持不变,当然DataGridView的当前行也要保持不变。
#16
我的这个问题的界面图:
#17
怎么放图片呀?
#18
终于想了个办法:
private void DataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
DataRowView _dview = (DataRowView)this.BindingContext[this.EditDataSet,
this.DataMember].Current;
_dview.EndEdit();
if (this.EditDataSet.HasChanges())
{
MessageBox.Show("数据已经 修改过,不能滚动");
e.Cancel = true;
}
}
我的QQ:249509209,有问题大家一起搞定.
private void DataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
DataRowView _dview = (DataRowView)this.BindingContext[this.EditDataSet,
this.DataMember].Current;
_dview.EndEdit();
if (this.EditDataSet.HasChanges())
{
MessageBox.Show("数据已经 修改过,不能滚动");
e.Cancel = true;
}
}
我的QQ:249509209,有问题大家一起搞定.