我正在开发一个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的数据源。 这不起作用,因为向数据源添加数据会将其添加为已提交行,因为数据无效而将数据保留为可编辑行,因此会引发异常验证不会发生。
答案 0 :(得分:6)
我花了几天时间,但这是我如何解决它,但我仍然愿意接受更好的方式。
在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错误,这是网格左侧的红色感叹号鼠标悬停文本显示您填写的ErrorText。只要您有MessageBox
弹出窗口,您就会失去对可编辑数据的关注并丢失该行。
答案 1 :(得分:2)
来自MSDN
private void DataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs anError)
{
MessageBox.Show(anError.RowIndex + " " + anError.ColumnIndex);
MessageBox.Show("Error happened " + anError.Context.ToString());
if (anError.Context == DataGridViewDataErrorContexts.Commit)
{
MessageBox.Show("Commit error");
}
if (anError.Context == DataGridViewDataErrorContexts.CurrentCellChange)
{
MessageBox.Show("Cell change");
}
if (anError.Context == DataGridViewDataErrorContexts.Parsing)
{
MessageBox.Show("parsing error");
}
if (anError.Context == DataGridViewDataErrorContexts.LeaveControl)
{
MessageBox.Show("leave control error");
}
if ((anError.Exception) is ConstraintException)
{
DataGridView view = (DataGridView)sender;
view.Rows[anError.RowIndex].ErrorText = "an error";
view.Rows[anError.RowIndex].Cells[anError.ColumnIndex].ErrorText = "an error";
anError.ThrowException = false;
}
}