在循环内添加行

时间:2017-10-24 23:21:19

标签: c# closedxml

如果我执行以下代码片段:

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
    }
}

这里到底发生了什么?看起来正在迭代的行集正在更新,这就是我想要发生的事情,因为注释掉的行抛出了一个错误"范围无效"在下一次迭代中,好像该行还没有初始化。

我理解在迭代它时修改一个集合是不好的做法,但我之前没有遇到任何问题。

实现这一目标的另一种方法是什么?

2 个答案:

答案 0 :(得分:0)

永远不要在迭代时修改集合......这是一个出价。 利用for循环。 如果之前没有引发异常,那么您只是更改了行的内容,而不是行本身的引用。

答案 1 :(得分:-1)

我最终使用了一个for循环,正如Bagerfahrer建议的那样,并有一个第二个计数器来跟踪行号:

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以检索数据,并跟踪我在电子表格中写到的位置。