将克隆的DataGridViewRow添加到DataGridViewRowCollection时,索引超出范围错误

时间:2016-02-23 15:38:55

标签: c# datagridview

我收到了错误:

  

指数超出范围。必须是非负数且小于集合的大小。\ r \ nParameter name:index

当我将克隆行添加到行DataGridViewRowCollection的{​​{1}}时,会发生此错误。但是,它不会立即发生,因为该函数首先被成功完成几次调用。

我的代码是:

collection.Add(coleRowWithValues(row))

其中public DataGridViewRowCollection getSelectedRows() { object value = null; DataGridViewRowCollection collection = new DataGridViewRowCollection(this); foreach (DataGridViewRow row in Rows) { value = row.Cells[columnCheckBox.Index].Value; if (value != null && (bool) value == true) { collection.Add(cloneRowWithValues(row)); //error happens here } } return collection; } 是从this派生的类。

DataGridView定义为:

cloneRowWithValues

我从the MSDN documentation得到的最后一个功能。

所以我的问题是:我在这里做错了什么,我该如何解决?

编辑: 我添加了一些来自调试器的额外信息。

  

Debug info

     

More debug info

第二次编辑:

在函数private DataGridViewRow cloneRowWithValues(DataGridViewRow oldRow) { DataGridViewRow newRow = (DataGridViewRow)oldRow.Clone(); for (Int32 i = 0; i < oldRow.Cells.Count; i++) { newRow.Cells[i].Value = oldRow.Cells[i].Value; } return newRow; } 中将变量index的名称更改为i时,错误仍然完全相同,因此我进行了更改以避免混淆。

1 个答案:

答案 0 :(得分:1)

你的问题在于:

DataGridViewRowCollection collection = new DataGridViewRowCollection(this);

这会创建一个链接到(source)

的DGVRowCollection
  

拥有DataGridViewRowCollection的DataGridView。

更改此对象将更改DataGridView。您似乎不想更改当前的DataGridView,只是想从中读取一些数据。

现在的方式,collectionRows相同的DGV相关联。在foreach迭代时更改集合是大多数集合的编译器错误。但是因为你没有改变Rows,而是collectioncollection.Add(cloneRowWithValues(row));这个奇怪的结构避开了,而是爆炸了。

改为将其更改为List<DataGridViewRow> list = new List<DataGridViewRow>(),并添加符合条件的行。返回列表。 或者使用LINQ,因为DGVR是一个Enumerable:

var selected = Rows.Where(row => row.Cells[columnCheckBox.Index].Value as bool? == true);

此外,那些调试屏幕截图是无用的,有趣的是崩溃时的变量。 (与OP合作让我获得了更好的信息)。

编辑:我现在阅读实际的克隆功能:

DataGridViewRow newRow = (DataGridViewRow)oldRow.Clone();
for (Int32 i = 0; i < oldRow.Cells.Count; i++)
{
    newRow.Cells[i].Value = oldRow.Cells[i].Value;
}
return newRow;

DataGridViewRow就像一个DataGridViewCell引用对象数组。克隆它会给出一个新的Row对象,并引用相同的单元格。 newRow.Cells[i]oldRow.Cells[i]完全相同。这里的任务确实没有任何意义,因为它存储了一个值。