设置: 我有两个 DataGridView,每个都绑定到自定义业务对象的 BindingList<>。这些网格有一个特殊的行,其中包含该网格中所有行的数学总计——这个特殊的行反映了 BindingList<> 中相应的特殊对象(我指定了这一点,以便您知道这不是要添加的行到 DGV,但将对象添加到 BindingList<>)。
错误: 有一段时间,我必须定期从 BindingList<> (因此从 DGV)中找到并删除 Totals Row 对象。这是我用来执行此操作的原始代码:
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”是总计行的索引。 我发现这个问题基本上是相同的,除了接受的答案是:1)不使用基础列表,我必须这样做,或者 2)从网格中删除而不是从列表中删除。我尝试了#2,将上面代码示例中最里面的方法调用替换为:
if (UnderlyingGridList[i].IsTotalRow) brokenDataGrid.Rows.RemoveAt(i);
这会引发相同的错误。 我还发现了这个问题,它建议在更改后重新绑定 - 但是,这是不可行的,因为此代码可能每秒调用一次,并且如果列表填充过多,它将使网格无法使用(我知道这个来自糟糕的经历)。
我可以只处理网格的 DataError 事件,但我宁愿不要每分钟弹出一百万个错误,即使它们是无声的。任何帮助将不胜感激。