Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据网格问题。使用数据集。与“编辑模板”合并_C#_.net_Winforms_Sorting_Datagridview - Fatal编程技术网

C# 数据网格问题。使用数据集。与“编辑模板”合并

C# 数据网格问题。使用数据集。与“编辑模板”合并,c#,.net,winforms,sorting,datagridview,C#,.net,Winforms,Sorting,Datagridview,我正在尝试调试WinForm应用程序的一个问题 应用程序使用绑定到数据集的DataGridView 用户可以选择一行并单击“编辑”,此时将显示一个编辑表单,以便用户可以编辑该行并保存所做的更改 如果DataGridView按一个或多个列排序,并且用户多次编辑一行,并通过两次更改其中一个排序列来更改该行在DataGrid中的位置,则DataGridView将不同步,并且会出现异常错误 下面是代码的编写方式: 当用户单击一行并点击编辑时,用户只能选择一行,该行将传递给EditFom。编辑表单创建一个

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

应用程序使用绑定到数据集的DataGridView

用户可以选择一行并单击“编辑”,此时将显示一个编辑表单,以便用户可以编辑该行并保存所做的更改

如果DataGridView按一个或多个列排序,并且用户多次编辑一行,并通过两次更改其中一个排序列来更改该行在DataGrid中的位置,则DataGridView将不同步,并且会出现异常错误

下面是代码的编写方式:

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

下面是几个场景,它们告诉我合并和排序与此有关:

注意,我从不更改实际的排序,我指的是更改其中一行中某个排序依据列的值

如果用户直接在网格中编辑一行,并更改用于排序的其中一列的值,然后再次更改该列,等等。该行会在网格中移动,就像它应该移动一样,当用户单击“保存”时,所有内容都会很好地保存

如果用户直接在网格中或通过模板编辑行,并且不更改任何排序列,只需通过将行的状态设置为“已修改”,对…进行编辑,然后用户使用模板编辑行,该模板通过单独的数据集进行编辑,并在编辑完成后合并数据,并更改正在排序的列中的一列。完成后,网格应移动,行应移动,行不会重新绘制,它在网格中的位置与模板编辑之前的位置相同。尽管如此,数据保存得很好,您可以刷新网格并正确排序。显然,DataGrid没有被通知行在这个场景中发生了更改,或者确实发生了更改,但是它没有对此做任何事情

如果用户直接在网格中编辑一行,更改该行移动的排序列,然后使用模板编辑该行并再次更改该列,则得到与上面第2条相同的结果。数据可以很好地保存,但当用户离开编辑模板时,网格不会恢复

这就是导致异常错误的原因

如果用户使用模板编辑行并更改排序列并离开模板,则datagrid将退出,行将正确移动。然后,如果用户使用模板编辑同一行,请再次编辑并更改排序列。当用户离开编辑模板时,datagrid不会使用,当用户保存数据并刷新网格时,我们会得到一个错误: System.InvalidOperationException:数据表内部索引已损坏:“5”

有时,我们会收到一个错误,抱怨主键丢失


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

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


我想我必须阻止用户在不保存的情况下多次编辑一行。这似乎是唯一的解决办法。网上有很多关于这些问题的帖子和文章,这似乎是一个持续的问题。