DataGridView DataError事件保留无效行

Chr*_*ris 5 c# datagridview winforms

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

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

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

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

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

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

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

编辑:

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

Chr*_*ris 6

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

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

Grid.Rows[e.RowIndex].ErrorText = "Concisely describe the error and how to fix it";
e.Cancel = true;
Run Code Online (Sandbox Code Playgroud)

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

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

Grid.Rows[e.RowIndex].ErrorText...
Run Code Online (Sandbox Code Playgroud)

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

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