我在我的代码隐藏中创建了两个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>
答案 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;
}