【问题标题】:DataGrid problems. Using DataSet.Merge with "Edit Template"数据网格问题。将 DataSet.Merge 与“编辑模板”一起使用
【发布时间】:2011-04-06 19:46:39
【问题描述】:

我正在尝试调试 WinForm 应用程序的问题。

应用程序使用绑定到 DataSet 的 DataGridView。

用户可以选择一行并单击“编辑”,然后会出现一个编辑表单,以便用户可以编辑该行并保存他的更改。

如果 DataGridView 按一列或多列排序,并且用户多次编辑一行并更改 DataGrid 中的行位置(通过两次更改排序的列之一),DataGridView 不同步,我得到异常错误。

代码是这样写的:

当用户点击一行并点击编辑(用户只能选择一行)时,该行将传递给 EditFom。编辑表单创建一个空数据集并加载该行。用户完成后,调用表单使用 DataSet.Merge 将这些更改合并回其 DataSet。

这里有几个场景告诉我它与“合并”和排序有关:

(注意,我从不更改实际的“排序”,我说的是更改其中一行中按列排序的值之一。)

    1234563用户点击保存,一切正常。
  1. 如果用户编辑一行(直接在网格中或通过“模板”)并且没有更改任何“排序”列,只需进行编辑(从而将行的“状态”设置为修改,对...),然后用户使用模板编辑行(通过单独的数据集并在完成后合并数据),并更改正在排序的列之一(完成后,网格应该使用和该行应该“移动”),该行不会被重新绘制,它在网格中的位置与模板编辑之前的位置相同。 (虽然,数据保存得很好,您可以刷新网格并正确排序。)显然,在这种情况下,DataGrid 没有被通知 RowChanged(或者它是,但它没有做任何事情)。

  2. 如果用户直接在 Grid 中编辑行,更改排序列(行移动),然后使用模板编辑行并再次更改该列,我们会得到与上面 2 相同的结果。数据保存得很好,但是当用户离开编辑模板时,网格不会使用。

(这是导致异常错误的原因。)

  1. 如果用户使用模板编辑行并更改排序列并离开模板,则数据网格会恢复并且行会正确移动。然后,如果用户使用模板编辑编辑同一行并再次更改排序列。当用户离开编辑模板时,datagrid 不会使用,当用户保存数据并且网格刷新时,我们会得到一个错误:

System.InvalidOperationException:DataTable 内部索引已损坏:“5”。

有时,我们会收到一条错误消息,抱怨主键丢失。

关于如何“调试”这个有什么建议吗?我觉得它与编辑模板使用的“中间”数据集和“合并”有关。这就像 DataGrid 数据源与 DataGrid 行不同步。

【问题讨论】:

    标签: c# .net winforms sorting datagridview


    【解决方案1】:

    我应该在发布这个之前做一些谷歌搜索。这似乎是一个常见错误,我在 MS 网站上发现了一篇关于此的巨大帖子。不幸的是,我尝试了他们的大部分建议,但很可能我会在那里找到答案。我只是想记下这一点,以防有人感兴趣:

    http://social.msdn.microsoft.com/Forums/en/adodotnetdataproviders/thread/18544cd3-1083-45fe-b9e7-bb34482b68dd

    【讨论】:

    • 我想我只需要阻止用户多次编辑一行(不保存)。这似乎是唯一的解决方案。网络上有很多关于这些问题的帖子和文章,这似乎是一个持续存在的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多