【问题标题】:DataGrid Exception Handling数据网格异常处理
【发布时间】:2015-08-08 16:54:30
【问题描述】:

我已经坚持了几个小时,希望有人能对此有所了解。假设我有一个DataGrid 控件:

<DataGrid ItemsSource="{Binding Path=RealEstates, ValidatesOnExceptions=True}"
          AutoGenerateColumns="True"
          Name="grdData_RealEstate" 
          Margin="5,5,5,5"
          Style="{StaticResource DataGridStyle}"
          RowStyle="{StaticResource DataGridRowStyle}">
</DataGrid>

绑定到公开DataSet 的 RealEstates 表的属性。

现在,当用户从该表中删除一行时,我想在允许或拒绝删除之前执行一些检查。 我所做的是订阅DataTable的RowDeleting事件。

workingDataSet.Tables["realestates"].RowDeleting += Database_RowDeleting;

然后在处理它的方法中,我只是抛出一个异常。一旦我开始工作,实际的逻辑就会随之而来。

void Database_RowDeleting(object sender, DataRowChangeEventArgs e)
{
    throw (new Exception("Can't delete"));            
}

当我试图从DataGrid 中删除任何行时,这会起作用并引发异常。但问题是DataGrid 控件没有捕获异常(DataGrid 控件的红色边框)导致我的程序关闭并且显然不是我想要的。知道我在这里做错了什么吗?如何让DataGrid 捕获这些异常?

【问题讨论】:

  • 简单的答案是你不能轻易抓住它。因此,从 C# 中的事件处理程序中抛出异常通常不是一个好主意。相反,只需将删除结果提供给自定义 EventArgs 类,或根据需要引发 DeleteSucceeded / DeleteFailed 事件。
  • @Octopoid:不完全确定您提出的解决方案是什么意思,但您的声明让我走上了正确的轨道,以避免在事件处理程序中引发异常。我想我现在有一个解决方案,将对其进行测试并将其作为答案,如果它有效。谢谢!

标签: c# wpf exception datagrid


【解决方案1】:

好的,我有其他感兴趣的人的解决方案。

我订阅了DataTableRowDeletingRowDeleted 事件:

workingDataSet.Tables["realestates"].RowDeleting += Database_RowDeleting;
workingDataSet.Tables["realestates"].RowDeleted += Database_RowDeleted;

然后我创建了一个字段来允许或拒绝删除:

bool allowRowDelete;

接下来我在RowDeleting 方法中执行我的验证逻辑:

void Database_RowDeleting(object sender, DataRowChangeEventArgs e)
{
    allowRowDelete = true;

    if (Convert.ToUInt32(e.Row["id"]) > 3)
        allowRowDelete = false;
}

然后在RowDeleted 方法中,如果验证失败,我拒绝删除:

void Database_RowDeleted(object sender, DataRowChangeEventArgs e)
{            
    if (!allowRowDelete)
        e.Row.RejectChanges();
}

虽然这是对这个问题的回答,但这不是我的首选解决方案,因为我最初想像在我的另一个 posts 中一样使用外键约束,现在必须这样做。

其他一些帖子,遇到同样问题的人可能会觉得有趣:

http://www.pcreview.co.uk/threads/how-to-stop-a-change-in-the-rowdeleting-event-handler.1239208/

What is the "pressed the delete key" event for the WPF Datagrid?

http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21758199.html

http://wpf.codeplex.com/discussions/39077

【讨论】:

  • 在您的 RowDeleting 事件处理程序中,您应该能够设置 e.Cancel = true; 以取消继续删除。
  • 现在这样会更有意义,但事实证明DataRowChangeEventArgs 没有这样的成员。它只提供执行的“操作”(显然是删除)和执行此操作的行。
  • 我的错误 - 错误的数据网格行!正如你所说,e.Cancel 本来会很好很整洁,但无论如何你的解决方案绝对没问题。
猜你喜欢
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 2011-09-18
相关资源
最近更新 更多