设置:
我有两个DataGridView,每个绑定到BindingList.自定义业务对象.这些网格具有包含该网格中所有行的数学总计的特殊行,该特殊行反映了BindingList中对应的特殊对象. (我指定是为了使您知道这不是将行添加到DGV,而是将对象添加到BindingList).
错误:
有时会有一段时间,我必须在BindingList中找到并删除Totals Row对象. (因此来自DGV).这是我用来执行此操作的原始代码:
private void RemoveTotalRow()
{
for (int i = UnderlyingGridList.Count - 1; i >= 0; i--)
{
if (UnderlyingGridList[i].IsTotalRow) UnderlyingGridList.RemoveAt(i);
}
}
(这并不重要,但是我循环遍历所有记录的原因是为了防止错误地存在多个“总计”行的可能性).在所有情况下,此代码都可以完美地在两个网格之一中运行.但是,在第二个网格上,调用RemoveAt方法时出现以下错误:
The following exception occurred in the DataGridView: System.IndexOutOfRangeException: Index 5 does not have a value. at System.Windows.Forms.CurrencyManager.get_Item(Int32 index) at System.Windows.Forms.DataGridView.DataGridViewDataConnection.GetError(Int32 rowIndex) To replace this default dialog please handle the DataError event.
…其中’5’是总计行的索引. I found this question,基本上是相同的,除了可接受的答案是:1)不使用我必须做的底层列表,或2)从网格而不是从列表中删除.我尝试通过将上面代码示例中最里面的方法调用替换为#2来进行尝试:
if (UnderlyingGridList[i].IsTotalRow) brokenDataGrid.Rows.RemoveAt(i);
这将引发相同的错误. I also found this question,建议更改后重新绑定-但是,这是不可行的,因为每秒可能会调用此代码一次,并且如果列表填充过多,将使网格无法使用(我从糟糕的经验中知道这一点) .
我可以处理网格的DataError事件,但我不想每分钟弹出一百万个错误,即使它们是静默的.任何帮助将不胜感激.
解决方法:
所以这是一组奇怪的情况……但是,这里是:
1)有问题的Grid定义了SelectionChanged事件,在其中调用了两行代码:
Grid.ClearSelection();
Grid.Refresh();
这些在这里是因为我正在伪造网格以使其看起来像是选定的行,而实际上却没有.通过这样做,我可以自定义网格的外观.
2)从我的问题触发代码的事件是网格的Sorted事件.
步骤3和步骤4是我的推测,但我的测试似乎支持该理论
3)Grid.Sorted事件显然也触发了此Grid.SelectionChanged事件.
4)网格现在正尝试刷新网格并同时删除总计行.因此,断点使它似乎应该工作,而实际上却不行.
从上述事件中删除Grid.Refresh()方法调用可以完全解决问题.在检查工作网格的Grid.SelectionChanged事件后,我发现仅调用ClearSelection()方法,而不是Refresh().
感谢在线程和c#聊天中在这里帮助过的人!