在循环内添加行
Adding rows inside a loop
如果我执行下面的代码片段:
IXLRange dataRange = worksheet.Range(1, 1, myData.Count, 4);
foreach (var row in dataRange.Rows()) {
//int cells = row.CellCount();
if (isEndOfGroup) {
row.InsertRowsBelow(1);
var rowBelow = row.RowBelow();
// Do stuff with the added row, like adding a subtotal
}
}
这里到底发生了什么?似乎正在迭代的行集合正在更新,这是我想要发生的,因为注释掉的行在下一次迭代时抛出错误 "Range is invalid" 的异常,就好像该行不知何故没有'尚未初始化。
我知道在遍历集合时修改集合是一种不好的做法,但我以前这样做没有任何问题。
实现此目标的替代方法是什么?
永远不要在迭代时修改集合...这是一个出价。
利用 for 循环。
当它之前没有引发异常时,那么您只是更改了行的内容而不是对行本身的引用。
我最终按照 Bagerfahrer 的建议使用了 for
循环,并使用了第二个计数器来跟踪行号:
int rowNum = 1; // Row numbering starts at 1
for (int i = 0; i < myData.Count; i++) {
var row = worksheet.Row(rowNum);
if (isEndOfGroup) {
row.InsertRowsBelow(1);
rowNum++;
var rowBelow = row.RowBelow();
// Do stuff with the added row, like adding a subtotal
}
rowNum++;
}
这让我可以索引到 myData
以检索数据,还可以跟踪我在电子表格中写入的位置。
如果我执行下面的代码片段:
IXLRange dataRange = worksheet.Range(1, 1, myData.Count, 4);
foreach (var row in dataRange.Rows()) {
//int cells = row.CellCount();
if (isEndOfGroup) {
row.InsertRowsBelow(1);
var rowBelow = row.RowBelow();
// Do stuff with the added row, like adding a subtotal
}
}
这里到底发生了什么?似乎正在迭代的行集合正在更新,这是我想要发生的,因为注释掉的行在下一次迭代时抛出错误 "Range is invalid" 的异常,就好像该行不知何故没有'尚未初始化。
我知道在遍历集合时修改集合是一种不好的做法,但我以前这样做没有任何问题。
实现此目标的替代方法是什么?
永远不要在迭代时修改集合...这是一个出价。 利用 for 循环。 当它之前没有引发异常时,那么您只是更改了行的内容而不是对行本身的引用。
我最终按照 Bagerfahrer 的建议使用了 for
循环,并使用了第二个计数器来跟踪行号:
int rowNum = 1; // Row numbering starts at 1
for (int i = 0; i < myData.Count; i++) {
var row = worksheet.Row(rowNum);
if (isEndOfGroup) {
row.InsertRowsBelow(1);
rowNum++;
var rowBelow = row.RowBelow();
// Do stuff with the added row, like adding a subtotal
}
rowNum++;
}
这让我可以索引到 myData
以检索数据,还可以跟踪我在电子表格中写入的位置。