我遇到了DataGridView的问题。 当我尝试删除其中一个项目并重新加载网格时,我有一个绑定到网格的3个项目的集合。
如果有代码
If (dlg.ShowDialog() = DialogResult.OK) Then
'Show dialog with grid on it
End If
在打开的对话框中,我从网格中删除了一个项目(应该从集合中删除项目,然后重新加载网格),然后返回“If(dlg.show ... “行,错误
“System.Windows.Forms.dll中发生'System.IndexOutOfRangeException'类型的第一次机会异常
其他信息:索引2没有值。 “
(我已经打开调试器设置为公共语言运行库错误)
如果我试图访问任何单元格,行或列,我可以理解这个错误,但我不会,然后我希望异常停止在尝试访问此网格数据的代码行上,而不是“如果(dlg.ShowDialog()...”行
有什么想法吗? 干杯
答案 0 :(得分:8)
我发现如果你加入
DataGridView.DataSource = Nothing
DataGridView.Refresh()
将网格重置为集合(删除已删除的项目)
DataGridView.DataSource = MyCollection
它就像一个魅力。 仍然有兴趣为什么你必须这样做。
答案 1 :(得分:0)
由于您正在显示模式对话框,因此可能会显示抛出的错误。您是否尝试在实际从网格/集合中删除的代码行中设置一个断点,以查看错误是否来自该错误?
答案 2 :(得分:0)
这似乎是一个.NET错误,我创建了一个测试程序,但仍然失败,但是通过在数据源绑定之前添加Null检查和项计数得到了一种解决方法:
If MyCollection IsNot Nothing AndAlso MyCollection.Count > 0 Then
DataGridView.DataSource = MyCollection
End If
答案 3 :(得分:0)
此错误表示在将数据源设置为null之前,数据源已为空或空。
例如:这将跳出您的例外情况
DataGridView.DataSource = Mylist;
Mylist.clear();
DataGridView.DataSource = null;
updateMyList();
DataGridView.DataSource = MyList;
在我的情况下,如果您的代码中的任何内容(线程/计时器或任何函数)试图在MyList清除/之前从DataGrid获取数据行/列(例如选择所有行..),它将跳出Exception。空的要解决此问题,请与我重新编码:
DataGridView.DataSource = Mylist;
DataGridView.DataSource = null; // Set null frist, take it seperate with data
Mylist.clear(); // clear data
updateMyList(); // update data...
DataGridView.DataSource = MyList; // update table, free error
祝你好运