gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:29:56 24 4
gpt4 key购买 nike

设置:我有两个 DataGridView,每个都绑定(bind)到自定义业务对象的 BindingList<>。这些网格有一个特殊的行,其中包含该网格中所有行的数学总和——这个特殊的行反射(reflect)了 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”是总计行的索引。 I found this question ,这基本上是相同的,除了接受的答案是:1)不使用我必须做的基础列表,或者 2)从网格而不是从列表中删除。我已经尝试了#2,将上面代码示例中最内层的方法调用替换为:

if (UnderlyingGridList[i].IsTotalRow) brokenDataGrid.Rows.RemoveAt(i);

这会引发相同的错误。 I also found this question ,这建议在更改后重新绑定(bind) - 但是,这是不可行的,因为此代码可能每秒调用一次,如果列表中填充的太多,它将使网格无法使用(我从糟糕的经历中知道这一点)。

我可以只处理网格的 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# - 从 DGV 中删除——索引 [x] 没有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6045094/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com