【发布时间】:2011-04-06 19:46:39
【问题描述】:
我正在尝试调试 WinForm 应用程序的问题。
应用程序使用绑定到 DataSet 的 DataGridView。
用户可以选择一行并单击“编辑”,然后会出现一个编辑表单,以便用户可以编辑该行并保存他的更改。
如果 DataGridView 按一列或多列排序,并且用户多次编辑一行并更改 DataGrid 中的行位置(通过两次更改排序的列之一),DataGridView 不同步,我得到异常错误。
代码是这样写的:
当用户点击一行并点击编辑(用户只能选择一行)时,该行将传递给 EditFom。编辑表单创建一个空数据集并加载该行。用户完成后,调用表单使用 DataSet.Merge 将这些更改合并回其 DataSet。
这里有几个场景告诉我它与“合并”和排序有关:
(注意,我从不更改实际的“排序”,我说的是更改其中一行中按列排序的值之一。)
-
1234563用户点击保存,一切正常。
如果用户编辑一行(直接在网格中或通过“模板”)并且没有更改任何“排序”列,只需进行编辑(从而将行的“状态”设置为修改,对...),然后用户使用模板编辑行(通过单独的数据集并在完成后合并数据),并更改正在排序的列之一(完成后,网格应该使用和该行应该“移动”),该行不会被重新绘制,它在网格中的位置与模板编辑之前的位置相同。 (虽然,数据保存得很好,您可以刷新网格并正确排序。)显然,在这种情况下,DataGrid 没有被通知 RowChanged(或者它是,但它没有做任何事情)。
如果用户直接在 Grid 中编辑行,更改排序列(行移动),然后使用模板编辑行并再次更改该列,我们会得到与上面 2 相同的结果。数据保存得很好,但是当用户离开编辑模板时,网格不会使用。
(这是导致异常错误的原因。)
- 如果用户使用模板编辑行并更改排序列并离开模板,则数据网格会恢复并且行会正确移动。然后,如果用户使用模板编辑编辑同一行并再次更改排序列。当用户离开编辑模板时,datagrid 不会使用,当用户保存数据并且网格刷新时,我们会得到一个错误:
System.InvalidOperationException:DataTable 内部索引已损坏:“5”。
有时,我们会收到一条错误消息,抱怨主键丢失。
关于如何“调试”这个有什么建议吗?我觉得它与编辑模板使用的“中间”数据集和“合并”有关。这就像 DataGrid 数据源与 DataGrid 行不同步。
【问题讨论】:
标签: c# .net winforms sorting datagridview