【发布时间】:2012-08-09 12:15:48
【问题描述】:
我有一个绑定到 WPF(.NET 3.5,WPFToolkit.dll)DataGrid 的 DataTable。这是在一个非常大的客户端-服务器应用程序中。服务器可以异步向客户端“引擎”发送数据;此数据以属性的形式发送,这些属性由引擎设置到我的控件上。
所以,作为我的意思的一个例子,我有一个class MyFunkyDataGrid : DataGrid。 MyFunkyDataGrid 有一个名为 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()。没有骰子。
有没有人见过这样的东西?
【问题讨论】:
-
如果将
MyFunkyGrid的ItemsSource或DataContext设置为null,会发生什么? -
@SeToY 没有数据显示(如预期)。底层数据表正在改变,但没有发生崩溃。这似乎只在 ItemSource 绑定到 DataTable.DefaultView 并且我在清除 dataTable 时编辑单元格时发生。
-
如果 ItemsSource 中的项目数为 37,会发生这种情况吗?
-
所以您只想放弃任何编辑?我会尝试将焦点设置到另一个控件。为什么要清除数据表并重新开始?为什么不只是修改/插入/删除适当的行?为什么不绑定到 Dic(string,Object) 的对象。 DataTable 的开销很大。