我收到了错误:
指数超出范围。必须是非负数且小于集合的大小。\ 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得到的最后一个功能。
所以我的问题是:我在这里做错了什么,我该如何解决?
编辑: 我添加了一些来自调试器的额外信息。
第二次编辑:
在函数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
时,错误仍然完全相同,因此我进行了更改以避免混淆。
答案 0 :(得分:1)
你的问题在于:
DataGridViewRowCollection collection = new DataGridViewRowCollection(this);
这会创建一个链接到(source)
的DGVRowCollection拥有DataGridViewRowCollection的DataGridView。
更改此对象将更改DataGridView。您似乎不想更改当前的DataGridView,只是想从中读取一些数据。
现在的方式,collection
与Rows
相同的DGV相关联。在foreach迭代时更改集合是大多数集合的编译器错误。但是因为你没有改变Rows
,而是collection
,collection.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]
完全相同。这里的任务确实没有任何意义,因为它存储了一个值。