1、使用SelectionChanged事件
2、使用RowEnter事件
====================
很长时间以来,我都是倾向于使用SelectionChanged事件来捕捉DataGridView中当前行发生改变。
直到今天,我觉得这个不好,因为我在msdn上看到如下对SelectionChanged事件的描述:
This event occurs whenever cells are selected or the selection is canceled, whether programmatically or by user action. For example, this event is useful when you want display the sum of the currently selected cells.
无论什么时候只要单元格被选中,或者表格的选中项(selection)被取消,SelectionChanged事件就会被触发(就会发生),
无论这种改变是通过程序使然,还是通过用户操作,这个事件都会被触发。
举例来说,当你想要显示当前选中单元格的一个加总值时,这个事件是很有用的。(所以,可以看出这个事件,最佳应用的场景应该是这里)
When you change the value of the CurrentCell property, the SelectionChanged event occurs before the CurrentCellChanged event. Any SelectionChanged event handler accessing the CurrentCell property at this time will get its previous value.
当你改变了当前单元格属性的值时,SelectionChanged事件将会发生,然后CurrentCellChanged事件会发生。任何SelectionChanged事件处理方法,在这时(‘这时’指的是你修改了当前单元格值得时候)访问CurrentCell属性所获得的值是之前的值,而不是当前的值(也就是你改变后的值);之所以说不好,不是说这个事件不可以达到反映当前行发生改变的这个事件,而因为这个事件不仅仅反映当前行改变,也包括了,其他一些可能选择项发生改变的情况,这些情况下,我的行可能根本没有改,只是在相同行中切换当前单元格而已。所以就会造成事件重复执行的问题;
加之,看到上面关于SelectionChanged事件应用举例的时候,也没有谈到用这个事件来捕捉行放生改变,这说明,这个事件在设计的时候就不是干这个事情用的,所以要改。
那么要改成什么?就是最开始看到的第二点列出的事件。
其实这个事件也不是今天才知道的事件,也是早就知道了的,为什么没有用呢?
因为在实际调试程序的过程中,发现,这个事件在捕捉当前行值得时候,捕捉不到正确的值,所以感觉这个事件不好用(你想,如果能够直接使用CurrentRow属性来访问是多么惬意的一件事!),直到今天我在MSDN上同时查看这个事件时,发现以下说明,我的想法开始变为倾向于使用RowEnter事件来捕捉行改变的事件了。那么我发现的说明是什么呢?其实也是很简单,如下:
This event occurs when the DataGridView is initially loaded, as well as when the user selects a row other than the current row.
当DataGridView被初始加载和用户选择了一个非当前行的其他行的时候,这个事件(RowEnter)会发生。(看到这里就知道,这个事件是设计用来反应行改变,而不是像SelectionChanged一样,虽然可以反应这种变化,但是它的设计初衷不是用来反应这个的)
This event occurs before the CurrentRow property is updated. To retrieve the index of the newly-entered row, use the DataGridViewCellEventArgs.RowIndex property within the event handler.
这个事件(RowEnter)发生后,CurrentRow属性才会被更新。所以在RowEnter事件处理方法中要使用 DataGridViewCellEventArgs.RowIndex来检索(retrieve)新选择行(newly-entered)的索引,而不是用CurrentRow属性进行检索。(你看,人家说的多清楚,一看就知道,这个事件确实设计用来反应行改变的)看到这里我没有理由不用这个事件(RowEnter)来捕捉行改变了,因为这个事件即可以很及时的反应行发生改变这个事件,又可以很准确取到新行(newly-entered)的值;之前调试程序时,发现的当前行捕捉不到正确值得问题,是自己的问题(没有很好看过这个事件的MSDN)。
尽管我说用CurrentRow是一件很惬意的事,但是我也知道,在错综复杂的消息触发机制中,很难保证所有的属性都能及时反映或被更新(因为,你在这里更新了,可能到下个事件哪里又出现了其他的问题),所以接受不能用CurrentRow这个不惬意事实(说不定哪一天自己去写事件,也会这样,哈哈。。。。)