我在Windows窗体上有一个数据网格。
当我最初更新该网格以包含数据,然后单击它时,我得到以下异常。
值得注意的是,窗体处理窗口的内部情况是例外, 因此,在我启动表单时会发现异常。
请注意,我必须勾选调用堆栈中的“显示外部代码”以显示下面的调用堆栈,否则它只显示[外部代码]。
就预感/故障排除步骤而言,认为它可能是由为所选项目触发的消息引起的,然后是现在选中的项目,我试图{@ 1}}更新数据后.SelectAll();
,结果相同。
例外:
DataGridView
调用堆栈:
IndexOutOfRangeException
{"Index -1 does not have a value."}
答案 0 :(得分:6)
通过使用通用BindingList
作为数据源而非通用List
,最终解决了该问题。
由于数据源中的值需要根据用户与表单的交互进行更改,因此我们重新填充列表并在每次更改时重新挂接(当它为List<>
时)。
在列表中的对象上实现INotifyPropertyChanged
后,我们使用了BindingList<>
,现在将数据绑定一次,并在需要时刷新。
虽然我仍然不知道为什么使用该列表会导致问题,但我很高兴我有一个可行的解决方案。
答案 1 :(得分:1)
如果您在后面的代码中处理单击事件,请在执行任何任务之前进行适当的验证。
if (e.ColumnIndex == 1) // check for correct column
{
if (e.RowIndex >= 0) // check for valied row index
{
DataGridViewRow dataGridViewRow = dataGridView1.Rows[e.RowIndex];
// do stuff like update delete..
}
}
答案 2 :(得分:0)
它似乎在某处存储旧列表并尝试为新对象更新某些内容。 你可以通过重新创建列表来绕过这个,如下所示:
// Get old list
List<BoardRow> rows = (List<BoardRow>)rowsDataGridView.DataSource;
// Add new row
rows.Add(form.boardRow);
// Re-create list
List<BoardRow> rowsNew = new List<BoardRow>(rows.Count);
rowsNew.AddRange(rows);
// Rebind source
this.rowsDataGridView.DataSource = rowsNew;
效果不是很好,但如果您需要对小型数据集进行肮脏的黑客攻击仍然有效。
答案 3 :(得分:0)
如果您要向DataError
上的所有人DataGridViews
添加自定义Form
事件,那么这是最好的方法,您可以发现错误。
试试吧。
private void DataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
}