C# DataGridView在选择另一个控件后激发。有解决办法吗?

C# DataGridView在选择另一个控件后激发。有解决办法吗?,c#,.net,winforms,datagridview,C#,.net,Winforms,Datagridview,使用RowValidating事件可以很好地工作 但是,如果我在datagridview中单击某个位置而不更改行,那么在选择另一个控件后,事件总是会触发 示例1(正确): Selecting a Row -> Selecting a Textbox -> Selecting antoher Row |->RowValidating raised Selecting a Row -> Clicking the Co

使用RowValidating事件可以很好地工作

但是,如果我在datagridview中单击某个位置而不更改行,那么在选择另一个控件后,事件总是会触发

示例1(正确):

Selecting a Row -> Selecting a Textbox -> Selecting antoher Row |->RowValidating raised Selecting a Row -> Clicking the Columnheader -> Selecting a Textbox -> Selecting antoher Row |->RowValidating raised |->RowValidating raised Selecting a Row -> Clicking empty Area -> Selecting a Textbox -> Selecting antoher Row |->RowValidating raised |->RowValidating raised 选择行->选择文本框->选择其他行 |->划船 示例2(不正确):

Selecting a Row -> Selecting a Textbox -> Selecting antoher Row |->RowValidating raised Selecting a Row -> Clicking the Columnheader -> Selecting a Textbox -> Selecting antoher Row |->RowValidating raised |->RowValidating raised Selecting a Row -> Clicking empty Area -> Selecting a Textbox -> Selecting antoher Row |->RowValidating raised |->RowValidating raised 选择行->单击列标题->选择文本框->选择其他行 |->RowValidating提升|->RowValidating提升 样本-3(不正确):

Selecting a Row -> Selecting a Textbox -> Selecting antoher Row |->RowValidating raised Selecting a Row -> Clicking the Columnheader -> Selecting a Textbox -> Selecting antoher Row |->RowValidating raised |->RowValidating raised Selecting a Row -> Clicking empty Area -> Selecting a Textbox -> Selecting antoher Row |->RowValidating raised |->RowValidating raised 选择行->单击空白区域->选择文本框->选择其他行 |->RowValidating提升|->RowValidating提升 在一行真正改变之前,有没有办法只让行失效


我已经尝试覆盖
SetSelectedRowCore
,并且能够取消选择更改,但是datagridview在
SetSelectedRowCore
被激发之前将
EndEdit()
发送到绑定。

我发现了一个不好的解决方法:

    private void dataGridView_RowValidating(object sender, DataGridViewCellCancelEventArgs e) {
        Point pos = dataGridView.PointToClient(Control.MousePosition);
        DataGridView.HitTestInfo hi = dataGridView.HitTest(pos.X, pos.Y);
        if (hi.Type == DataGridViewHitTestType.Cell && hi.RowIndex != e.RowIndex) {
            e.Cancel = !AllowChangeCurrent(); //Check if changing selection is allowed
        }
    }
首先,我得到DataGridView中的当前鼠标位置

之后,我检查是否单击了某个单元格。(错误->完成)

至少我检查单击的单元格/行是否不是当前单元格/行(False->Finished | True->Validate)