c#-从DGV中删除-索引[x]没有值

设置:
我有两个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#聊天中在这里帮助过的人!

上一篇:c#-DataGridView的数据绑定单元格


下一篇:CodeGo.net> ORM,数据绑定到DataGridView:插入/删除未保存到数据库的新行