【问题标题】:Clearing DataTable while editing DataGrid编辑 DataGrid 时清除 DataTable
【发布时间】:2012-08-09 12:15:48
【问题描述】:

我有一个绑定到 WPF(.NET 3.5,WPFToolkit.dll)DataGrid 的 DataTable。这是在一个非常大的客户端-服务器应用程序中。服务器可以异步向客户端“引擎”发送数据;此数据以属性的形式发送,这些属性由引擎设置到我的控件上。

所以,作为我的意思的一个例子,我有一个class MyFunkyDataGrid : DataGridMyFunkyDataGrid 有一个名为 MyFunkyData 的 DependencyProperty,它的类型为 Dictionary<string, Object>。每当在服务器上更改MyFunkyData 时,它会立即在客户端上同步,并设置为MyFunkyDataGrid。当MyFunkyData 发生变化时,我翻阅字典并将数据设置到网格的 DataTable 中。

当然,发生这种情况时,我首先需要清除其当前数据的DataTable。所以我打电话给dataTable.Clear()。通常这是一种享受。 但是如果我在清除 dataTable 时正在编辑 MyFunkyDataGrid 中的单元格,我会得到:

System.ExecutionEngineException was unhandled
  Message=Exception of type 'System.ExecutionEngineException' was thrown.
  InnerException: 

这使我的应用程序崩溃。我尝试在 MyFunkyDataGrid 上调用 CancelEdit(),我尝试在 DataRow 本身上调用它。在调用Clear() 之前,我尝试在DataTable 上调用RejectChanges()。没有骰子。

有没有人见过这样的东西?

【问题讨论】:

  • 如果将MyFunkyGridItemsSourceDataContext 设置为null,会发生什么?
  • @SeToY 没有数据显示(如预期)。底层数据表正在改变,但没有发生崩溃。这似乎只在 ItemSource 绑定到 DataTable.DefaultView 并且我在清除 dataTable 时编辑单元格时发生。
  • 如果 ItemsSource 中的项目数为 37,会发生这种情况吗?
  • 所以您只想放弃任何编辑?我会尝试将焦点设置到另一个控件。为什么要清除数据表并重新开始?为什么不只是修改/插入/删除适当的行?为什么不绑定到 Dic(string,Object) 的对象。 DataTable 的开销很大。

标签: c# wpf datagrid datatable


【解决方案1】:

我不确定为什么即使在清除数据表之前调用 datagrid.CancelEdit() 也会引发异常。但是在清除数据网格之前可以采取另外两个预防措施,这可能会避免异常:

(1)可以将selecteditem设置为datagrid的null

(2)可以将datagrid的ItemSource设置为null,而不是datatable,然后清除datatable。

【讨论】:

    猜你喜欢
    • 2015-10-04
    • 2012-12-19
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多