c# – DataGridView DataError事件保留无效行

我正在开发一个Winforms应用程序,它显示一个绑定到某个数据库表的DataGridView.

它允许插入新的条目,并进行一些数据验证.

如果将所需列留空,或者违反了其中一个唯一约束,则DataError事件将调用此函数:

protected void _data_error(object sender, DataGridViewDataErrorEventArgs e)
{
    MessageBox.Show(this,e.Exception.Message,"Error");
    e.ThrowException = false;
    e.Cancel = false;
}

关闭弹出窗口后,将删除正在编辑的新行.
当对已经保存的行(更新操作)执行此操作时,该行将丢失其更改并失去焦点.
我认为这意味着我需要发信号通知应用程序以保持行可编辑,但我不知道该怎么做.

矛盾的是,如果我用throw(e.Exception)替换事件处理程序,异常将被抛出并由未捕获的异常处理程序拾取,但在该窗口关闭后保留新行.

如何在DataError事件上保留新行?

编辑:

我的下一个想法是保存行并在MessageBox弹出后将其添加到DataGridView的数据源.
这不起作用,因为向数据源添加数据会将其添加为已提交的行,因为数据无效而将数据保留为可编辑行,因此不会发生验证.

解决方法:

花了我几天,但这是我如何解决它,但我仍然是一个更好的方式开放.

DataGridView.RowValidating事件中,验证每个单元格的内容.
如果它无效,请执行以下操作:

Grid.Rows[e.RowIndex].ErrorText = "Concisely describe the error and how to fix it";
e.Cancel = true;

并确保通过事件处理程序清除下一行程中的错误文本.

例如,对于用户输入无效类型的数据,例如将文本文本转换为仅数字列的情况,您将必须处理DataGridView.DataError事件中的错误.使用相同的代码:

Grid.Rows[e.RowIndex].ErrorText...

但是没有必要清除ErrorText,因为您的行验证事件将处理它.

注意:这将不允许您有弹出窗口通知用户有什么问题,它将使用DataGridView错误,这是网格左侧的红色感叹号,鼠标悬停文本显示您填写的错误文本.只要你有一个MessageBox弹出窗口,你就会失去对可编辑数据的关注并丢失行.

上一篇:痞子衡嵌入式:盘点国内RISC-V内核MCU厂商(2018年发布产品)


下一篇:痞子衡嵌入式:盘点国内RISC-V内核MCU厂商(2020年发布产品)