如何实现DataGridView行位置改变前的事件?

时间:2022-11-11 10:32:08
VS2005,C#,Windows应用程序
当用户用鼠标或方向键改变当前行位置时,我希望在改变前先判断另外2个DataGridView中的数据是否已被用户修改,如果修改了则弹出提示对话框,让用户选择是否保存数据,若用户选择“取消”则不保存并且不变换行位置,选择“是”或“否”则保存或不保存数据并允许选择至新行。
所以我希望有个行位置改变前的事件,以实现这种功能。但发现并没有这个事件,只有RowLeave和RowEnter事件,这2个都是发生后的事件,并不是发生前的事件。

18 个解决方案

#1


补充:
DataGridView绑定了强类型BindingSource绑定源,BindingSource绑定源的PositionChanged事件实现当行位置改变时检索填充符合条件的数据至另2个DataGridView。
PositionChanged事件也是发生后的事件,要是有个ing发生前的事件就好处理,可惜我一直没找到。

#2


我想
可以在数据源绑定之后进行操作噢。。我也不是太清楚。。。我想想吧。。。

#3


有一个databound事件。。。可以开启一个检测。。


#4


行位置:SelectionChanged 里面加响应函数比较好
数据改变:CellValueChanged事件
双剑鹤壁,应该没有问题吧?

#5


你可以参考使用如下的事件:

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


该回复于2008-07-22 16:35:11被版主删除

#9


引用 4 楼 yizihu 的回复:
行位置:SelectionChanged 里面加响应函数比较好 
数据改变:CellValueChanged事件 
双剑鹤壁,应该没有问题吧?


同意!

我以前就用这两个

#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;
            }
        }

#15


geniusatm4这种方式是不行的。如果用户用上下方向键或翻页键改变DataGridView行位置时怎么办呢?还有如果改变了绑定源BindingSource的Position值也会改变DataGridView的行位置,还有就是点工具栏的“第一条、上一条、下一条、最后条”时也会改变DataGridView的行位置。
我知道如果用最笨的方法如:按键控制、鼠标控制、工具栏的“第一条、上一条、下一条、最后条”也控制、所有让Position值改变的地方都控制等,这样是可以实现这种功能,但这样实在太费周折了,也不科学不好维护,如果有上百个Form都要这样做,那就麻烦了。
所以如果有个绑定源BindingSource的Position值改变前ing的事件那就好统一管理和控制了,允许则改变Position值,不允许则Position值保持不变,当然DataGridView的当前行也要保持不变。

#16


我的这个问题的界面图:
如何实现DataGridView行位置改变前的事件?

#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,有问题大家一起搞定.

#1


补充:
DataGridView绑定了强类型BindingSource绑定源,BindingSource绑定源的PositionChanged事件实现当行位置改变时检索填充符合条件的数据至另2个DataGridView。
PositionChanged事件也是发生后的事件,要是有个ing发生前的事件就好处理,可惜我一直没找到。

#2


我想
可以在数据源绑定之后进行操作噢。。我也不是太清楚。。。我想想吧。。。

#3


有一个databound事件。。。可以开启一个检测。。


#4


行位置:SelectionChanged 里面加响应函数比较好
数据改变:CellValueChanged事件
双剑鹤壁,应该没有问题吧?

#5


你可以参考使用如下的事件:

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


该回复于2008-07-22 16:35:11被版主删除

#9


引用 4 楼 yizihu 的回复:
行位置:SelectionChanged 里面加响应函数比较好 
数据改变:CellValueChanged事件 
双剑鹤壁,应该没有问题吧?


同意!

我以前就用这两个

#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;
            }
        }

#15


geniusatm4这种方式是不行的。如果用户用上下方向键或翻页键改变DataGridView行位置时怎么办呢?还有如果改变了绑定源BindingSource的Position值也会改变DataGridView的行位置,还有就是点工具栏的“第一条、上一条、下一条、最后条”时也会改变DataGridView的行位置。
我知道如果用最笨的方法如:按键控制、鼠标控制、工具栏的“第一条、上一条、下一条、最后条”也控制、所有让Position值改变的地方都控制等,这样是可以实现这种功能,但这样实在太费周折了,也不科学不好维护,如果有上百个Form都要这样做,那就麻烦了。
所以如果有个绑定源BindingSource的Position值改变前ing的事件那就好统一管理和控制了,允许则改变Position值,不允许则Position值保持不变,当然DataGridView的当前行也要保持不变。

#16


我的这个问题的界面图:
如何实现DataGridView行位置改变前的事件?

#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,有问题大家一起搞定.