HtmlTable在迭代并将其添加到标记

时间:2015-05-12 19:43:54

标签: c# webforms

我在我的代码隐藏中创建了两个HtmlTable,每个HtmlTable都有各自的HtmlTableRow(s)。在创建这些之后,我需要按特定顺序将它们添加到标记中的<table name="teamoptionstable">元素。但是当我循环将每个HtmlTableRow添加到我的teamoptionstable时,HtmlTable似乎在我迭代时删除行。这是代码:

HtmlTable gaTable = new HtmlTable();
HtmlTable supportTable = new HtmlTable();

HtmlTableRow gaHeaderRow = new HtmlTableRow();
gaHeaderRow.Cells.Add(new HtmlTableCell {
    InnerHtml = "<tr id='gaHeaderLeft'><th colspan='3'>G&A</th></tr>"
});
gaTable.Rows.Add(gaHeaderRow);

HtmlTableRow supportHeaderRow = new HtmlTableRow();
supportHeaderRow.Cells.Add(new HtmlTableCell {
    InnerHtml = "<tr id='supportHeaderLeft'><th colspan='3'>Support</th></tr>"
});
supportTable.Rows.Add(supportHeaderRow);

using(DataTable departmentList = Database.ObjectList_Get(Database.ObjectType.Department)) {
    foreach(DataRow department in departmentList.Rows) {
        int departmentId = Convert.ToInt32(department["department_id"]);
        string departmentName = department["name"].ToString();
        HtmlTableRow data = new HtmlTableRow();
        if (...) {
            data.Cells.Add(...);
            data.Cells.Add(...);
            data.Cells.Add(...);
            gaTable.Rows.Add(data);
        } else if (...) {
            data.Cells.Add(...);
            data.Cells.Add(...);
            data.Cells.Add(...);
            supportTable.Rows.Add(data);
        }
    }
}

for (int i = 0; i < gaTable.Rows.Count; i++) {
    teamoptionstable.Rows.Add(gaTable.Rows[i]);
}
for (int i = 0; i < supportTable.Rows.Count; i++) {
    teamoptionstable.Rows.Add(supportTable.Rows[i]);
}

问题出现在我的for循环中。当它第一次迭代时,由于某种原因,gaTable.Rows.Count发生变化,它减少了一个。所以我最终为teamoptionstable添加了更少的行。这是teamoptionstable的标记:

<table class="table table-condensed table-striped" id="teamoptionstable" name="teamoptionstable" runat="server">
    <thead>
        <tr>
            <th>Team</th>
            <th>Primary Rule</th>
            <th>Secondary Rule</th>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>

1 个答案:

答案 0 :(得分:1)

这是因为HtmlTableRow是引用类型。因此,当您将对该行的引用添加到另一个表时,您将从第一个表中删除该引用。这类似于其他语言的指针。

因此,当你从0开始循环时,你只会经过一半的行。

实施例。这是你的行集:

Table 1: [0][1][2][3][4][5]

您获取索引0并将其添加到新表中。你现在离开了这个,因为你从第一张桌子上拿了一个参考。注意它是如何变化的。你没有索引1-5,你有索引0-4。

Table 1: [0][1][2][3][4]
Table 2: [0]

然后你的循环增加更多,你最终达到了这一点:

Table 1: [0][1][2]
Table 2: [0][1][2]

现在当你到达索引3时,就没有了。如果您不关心订单,那么您可以做的一件事就是向下迭代,从行数开始并向0方向努力。

for (int i = gaTable.Rows.Count - 1; i >= 0; i--)
{
    teamoptionstable.Rows.Add(gaTable.Rows[i]);
}

这将允许您从第一个表的末尾开始,并考虑索引的转换。但是,这显然会让你有一个反向表。

如果您关心订单,则需要重新创建所有行和单元格,然后将它们添加到第二个表格中。丹尼尔·戴森(Daniel Dyson)提出的Here is a great answer方法就是这样做的。我对它做了一些修改。这是未经测试的,所以要注意这一点。

protected HtmlTable CopyTable(HtmlTable copyFromTable)
{
    if (copyFromTable != null && copyFromTable.Rows.Count > 0)
    {
        var copyToTable = new HtmlTable();
        HtmlTableRow copyRow;
        HtmlTableCell copyCell;

        for (int i = 0; i < copyFromTable.Rows.Count - 1; i++)
        {
            copyRow = new HtmlTableRow();
            for (int j = 0; j < copyFromTable.Rows[i].Cells.Count - 1; j++)
            {
                copyCell = new HtmlTableCell();
                copyCell.InnerHtml = copyFromTable.Rows[i].Cells[j].InnerHtml;
                copyRow.Cells.Add(copyCell);
            }
            copyToTable.Rows.Add(copyRow);
        }

        return copyToTable;
    }

    return null;
}