我正在尝试使用WinForm应用程序调试问题。
应用程序使用绑定到DataSet的DataGridView。
用户可以选择一行并单击“编辑”,然后会出现一个编辑表单,以便用户可以编辑该行并保存其更改。
如果DataGridView按一列或多列排序,并且用户多次编辑一行并更改DataGrid中的行位置(通过更改其中一个排序列TWICE),则DataGridView不同步,我得到异常错误。
以下是代码的编写方式:
当用户单击一行并点击编辑(用户可能只选择一行)时,该行将传递给EditFom。编辑表单创建一个空数据集并加载该行。用户完成后,调用表单使用DataSet.Merge将这些更改合并回其DataSet。
以下几个场景告诉我它与“合并”和排序有关:
(注意,我从不改变实际的“排序”,我正在谈论改变其中一行中按排序列之一的值。)
如果用户直接在网格中编辑一行并更改其中一个用于排序的列的值,则再次更改它等等。该行在网格周围移动,就像它应该和当用户点击保存,一切都保存得很好。
如果用户编辑了一行(直接在网格中或通过“模板”)并且没有更改任何“排序”列,只需进行编辑(通过将行的“状态”设置为修改,正确...),然后用户使用模板编辑行(通过单独的DataSet并在完成后合并数据),并更改正在排序的列之一(完成后,网格应该使用该行应该“移动”),该行没有得到REPAINTED,它保持在模板编辑之前的网格中的相同位置。 (虽然,数据保存得很好,您可以刷新网格并对其进行正确排序。)显然,DataGrid在这种情况下没有得到RowChanged的通知(或者它是,但它没有做任何关于它的事情)。
如果用户直接在网格中编辑行,更改排序列(行移动),然后使用模板编辑行并再次更改该列,我们得到与上面2相同的结果。数据保存得很好,但是当用户离开编辑模板时,网格不会求助。
(这是导致异常错误的那个。)
System.InvalidOperationException:DataTable内部索引已损坏:'5'。
有时,我们会收到错误,抱怨主键丢失。
关于如何“调试”这个的任何建议?我觉得它与编辑模板使用的“internediate”数据集和“Merge”有关。就像DataGrid数据源与DataGrid Rows不同步一样。
答案 0 :(得分:0)
我应该在发布之前做一些谷歌。这似乎是一个常见错误,我在MS网站上发现了一篇关于此问题的巨大帖子。不幸的是,我已经尝试了他们的大部分建议,但很可能我会在那里找到答案。我只是想记下这个,如果有人有兴趣的话: