我有一个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的任何挂起编辑,拒绝对其基础DataTable的所有更改,等等。不幸的是,如果用户输入了无效数据或只是部分输入了以任何未通过验证的方式排。取消仅在所有表单数据有效时才有效,这显然有问题。
所以我跳到我的取消按钮的代码并尝试绕过验证。我使用EndEdit
,CancelEdit
,CausesValidation
等无济于事,经过快速跟踪后,我发现为什么没有效果 - 验证处理程序使我的代码无法访问。
我的问题是RowValidating事件似乎在我的按钮的点击处理程序被触发之前触发,而e.Cancel = true
似乎结束了两个处理程序的执行。在任何情况下,点击取消都会触发dgv.RowValidating
,永远不会触及button.Click
。我也没有看到任何方法来识别我的按钮点击触发验证的发件人/ EventArgs,所以我不确定如何辨别......
那么我如何a)在验证前触发我的按钮代码或b)确定按钮点击并绕过它来验证验证?
或者我完全做错了什么?
答案 0 :(得分:1)
将取消Button
的{{3}}属性设置为false
,然后在您的DataGridView
事件处理程序中调用Click
的{{3}}方法取消按钮:
private void button1_Click(object sender, EventArgs e)
{
this.dataGridView1.CancelEdit();
}
为您的按钮设置CausesValidation
,可以防止在您点击按钮时引发验证事件。然后致电CancelEdit
DataGridView
,取消当前编辑单元的待处理更改。
同时将表单的AutoValidate
属性设置为EnableAllowFocusChange
,可以让您从无效的编辑控件更改焦点(从而点击取消按钮)。