Winform的DataGridView控件在编辑单元格时事件触发顺序

时间:2020-12-25 19:26:15

在我的测试过程中,从编辑单元格到结束编辑整个过程仅仅涉及到一下几个事件:

dgv_Test_CellBeginEdit

dgv_Test_CellValidating

dgv_Test_CellParsing

dgv_Test_CellValueChanged

dgv_Test_CellValidated

dgv_Test_CellEndEdit

其它可能触发的事件未做测试。

测试过程:


测试1:单元格初始数据为A,进入编辑,不修改单元格数据,直接退出编辑模式

【测试步骤】:

                1、点击进入单元格进行编辑。
                2、不修改单元格数据,切换单元格直接离开编辑模式。

【事件触发顺序】:

1->dgv_Test_CellBeginEdit
e.RowIndex:[0]
e.ColumnIndex:[3]

2->dgv_Test_CellValidating
e.RowIndex:[0]
e.ColumnIndex:[3]

3->dgv_Test_CellValidated
e.RowIndex:[0]
e.ColumnIndex:[3]

4->dgv_Test_CellEndEdit
e.RowIndex:[0]
e.ColumnIndex:[3]


测试2:单元格初始数据为A,然后修改为B,重新改为A,在单元格离开编辑模式时单元格数据未发生变化。
【测试步骤】:

          1、点击进入单元格进行编辑,此时单元格数据为A。
          2、修改单元格数据为B。
          3、还原为修改前的数据A。
          4、切换单元格离开编辑模式(此时单元格数据变化:原数据->新数据->原数据)。

【事件触发顺序】:

1->dgv_Test_CellBeginEdit
e.RowIndex:[1]
e.ColumnIndex:[3]

2->dgv_Test_CellValidating
e.RowIndex:[1]
e.ColumnIndex:[3]

3->dgv_Test_CellParsing
e.RowIndex:[1]
e.ColumnIndex:[3]

4->dgv_Test_CellValidated
e.RowIndex:[1]
e.ColumnIndex:[3]

5->dgv_Test_CellEndEdit
e.RowIndex:[1]
e.ColumnIndex:[3]

当单元格在离开编辑模式时,数据项没有改变时,但存在修改过程,触发dgv_Test_CellParsing,但dgv_Test_CellValueChanged没有触发。


测试3:单元格初始数据为A,修改为B,离开单元格编辑模式,单元格数据发生变化:
【测试步骤】:

         1、点击进入单元格编辑模式,此时单元格初始数据为A。
         2、修改单元格数据为B。
         3、退出单元格编辑模式。

【事件触发顺序】:

1->dgv_Test_CellBeginEdit
e.RowIndex:[2]
e.ColumnIndex:[3]

2->dgv_Test_CellValidating
e.RowIndex:[2]
e.ColumnIndex:[3]

3->dgv_Test_CellParsing
e.RowIndex:[2]
e.ColumnIndex:[3]

4->dgv_Test_CellValueChanged

5->dgv_Test_CellValidated
e.RowIndex:[2]
e.ColumnIndex:[3]

6->dgv_Test_CellEndEdit
e.RowIndex:[2]
e.ColumnIndex:[3]



测试3:单元格初始数据为A,不进入单元格编辑模式,直接切换单元格:
【测试步骤】:

           1、点击选中单元格。

           2、切换选中的单元格,没有进入编辑模式时触发顺序:

【事件触发顺序】:

1->dgv_Test_CellValidating:[row:0] [column:3]

2->dgv_Test_CellValidated:[row:0] [column:3]

此过程不会触发dgv_Test_CellBeginEdit、dgv_Test_CellEndEdit、dgv_Test_CellParsing、dgv_Test_CellValueChanged方法,未进行编辑,值没有放生变化


触发了CellParsing 事件则说明单元格值存在修改过程,但是修改前和修改后的数据可能一致。


测试4:正在编辑的单元格:直接按下ESC取消编辑

将还原为编辑之前的值,并且不会触发dgv_Test_CellValidating、dgv_Test_CellValidated事件、dgv_Test_CellParsing、dgv_Test_CellValueChanged,

【触发事件以及执行顺序:】

1->dgv_Test_CellBeginEdit
e.RowIndex:[3]
e.ColumnIndex:[3]

2->dgv_Test_CellEndEdit
e.RowIndex:[3]
e.ColumnIndex:[3]


另外:

DataGridView.EndEdit()  :关闭在当前单元格的编辑操作 此方法将触发 CellEndEdit 事件。

DataGridView.BeginEdit()  :如果单元格支持编辑,将设置当前单元格进入编辑模式,此方法将触发 CellBeginEdit 事件。

不要尝试在CellBeginEdit事件中调用DataGridView.BeginEdit()方法,

也不要尝试在CellEndEdit 事件中调用DataGridView.EndEdit() 方法,

会造成死循环


在每个触发的事件中,可以通过参数e中的属性,获取当前正在编辑的单元格的当前值,原始值。