C# DataGridView中的单元格验证阻止取消按钮触发

C# DataGridView中的单元格验证阻止取消按钮触发,c#,.net,winforms,validation,datagridview,C#,.net,Winforms,Validation,Datagridview,我有一个DataGridView,其中有几列我正在对其进行空验证,如下所示: dgv.RowValidating += DisallowNulls; private void DisallowNulls(object sender, DataGridViewCellCancelEventArgs e) { if (dgv.Rows[e.RowIndex].Cells[0].Value == DBNull.Value || dgv.Rows[e.RowIndex].Cells[1].Va

我有一个DataGridView,其中有几列我正在对其进行空验证,如下所示:

dgv.RowValidating += DisallowNulls;

private void DisallowNulls(object sender, DataGridViewCellCancelEventArgs e)
{
    if (dgv.Rows[e.RowIndex].Cells[0].Value == DBNull.Value || dgv.Rows[e.RowIndex].Cells[1].Value == DBNull.Value )
    {
        dgv.Rows[e.RowIndex].ErrorText = "Cells may not be empty";
        e.Cancel = true;
    }
}
此DataGridView作为带有“取消”按钮的条目表单的一部分存在。在单击取消按钮的情况下,我希望取消对DGV的任何挂起的编辑,拒绝对其基础数据表的所有更改,等等。不幸的是,如果用户输入了无效数据或只是以任何方式部分输入了行而未通过验证,则此操作似乎会失败。“取消”仅在所有表单数据都有效时起作用,这显然是有问题的

因此,我跳进我的取消按钮的代码,并试图绕过验证。我玩了
EndEdit
CancelEdit
CausesValidation
等都没有用,快速跟踪后,我明白了为什么这些都不起作用-验证处理程序使我的代码无法访问

我的问题是RowValidating事件似乎是在我的按钮的click处理程序被触发之前触发的,并且
e.Cancel=true
似乎结束了这两个处理程序的执行。在任何情况下,单击“取消”将触发
dgv.RowValidating
,并且永远不会到达
按钮。请单击所有按钮。我也看不到任何方法可以从发送者/事件参数中辨别我的按钮点击触发了验证,所以我不确定如何区分

那么,我该如何a)在验证之前激活按钮的代码,或者b)确定验证是由按钮点击触发的并绕过它

还是我完全做错了什么?

将取消
按钮的属性设置为
false
,然后在
中调用
DataGridView
的方法,单击取消按钮的事件处理程序:

private void button1_Click(object sender, EventArgs e)
{
    this.dataGridView1.CancelEdit();
}
为按钮设置
CausesValidation
,可防止在单击按钮时引发验证事件。然后,通过调用
DataGridView
CancelEdit
,可以取消当前编辑单元格的挂起更改


另外,将表单的
自动验证
属性设置为
启用AllowFocuschange
,可以将焦点从无效的编辑控件中更改(并单击取消按钮)。

还可以将表单的
自动验证
属性设置为
启用AllowFocuschange
,允许您更改无效编辑控件的焦点(从而单击取消按钮)。
AutoValidate
是我丢失的位。我已经尝试过你在回答中提到的东西,但是我错过了这个一键设置。如果您想将该信息编辑到答案中,我会立即接受。事实上,将
AutoValidate
设置为
EnableAllowFocusChange
是另一个选项。但我也会把它加到答案上。