单击任何单元格时,DataGrid会从CurrencyManager中抛出IndexOutOfRangeException

时间:2011-10-18 15:55:39

标签: c# winforms datagrid

我在Windows窗体上有一个数据网格。

当我最初更新该网格以包含数据,然后单击它时,我得到以下异常。

值得注意的是,窗体处理窗口的内部情况是例外, 因此,在我启动表单时会发现异常。

请注意,我必须勾选调用堆栈中的“显示外部代码”以显示下面的调用堆栈,否则它只显示[外部代码]。

就预感/故障排除步骤而言,认为它可能是由为所选项目触发的消息引起的,然后是现在选中的项目,我试图{@ 1}}更新数据后.SelectAll();,结果相同。

例外:

DataGridView

调用堆栈:

IndexOutOfRangeException
{"Index -1 does not have a value."}

4 个答案:

答案 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)
{

}