我正在尝试手动将三个标头添加到表格中。该表用SqlDataReader中的数据填写得很好,但我无法让第一行坚持下去。
TableRow iRow = new TableRow();
TableCell iCell = new TableCell();
iCell.Text = "SUBMITTED BY";
iRow.Cells.Add(iCell);
iCell.Text = "ON";
iRow.Cells.Add(iCell);
iCell.Text = "ISSUE DESCRIPTION";
iRow.Cells.Add(iCell);
table.Rows.Add(iRow);
仅导致最后一个条目(在本例中为ISSUE DESCRIPTION)显示在表格中。我在
中找到了解决方法 TableRow iRow = new TableRow();
TableCell iCell = new TableCell();
TableCell iCell2 = new TableCell();
TableCell iCell3 = new TableCell();
iCell.Text = "SUBMITTED BY";
iRow.Cells.Add(iCell);
iCell2.Text = "ON";
iRow.Cells.Add(iCell2);
iCell3.Text = "ISSUE DESCRIPTION";
iRow.Cells.Add(iCell3);
table.Rows.Add(iRow);
但这让我感到烦恼的是多么麻烦。我的逻辑有问题,还是我在C#中缺少一些东西?我对C有很好的处理能力,但几周前刚开始使用C#。
谢谢!
答案 0 :(得分:11)
我在C#
中缺少什么
听起来很赞,是的。
此:
TableCell iCell = new TableCell();
创建一个TableCell
对象,并将引用分配给iCell
变量。 iCell
的值只是对象的引用。这不是对象本身。这样:
iRow.Cells.Add(iCell);
将引用传递给Add
方法。它没有将对象传递给Add
- 你永远不能在C#中做到这一点。因此,您的行最终会有大量对同一单元格的引用,以及您在这些行中所做的所有更改:
iCell.Text = "ON";
只是互相覆盖,因为他们正在对同一个对象进行更改。
您可能会发现这些文章很有用:
我个人会更改你的代码以使用集合初始化器和对象初始化器:
TableRow row = new TableRow {
Cells = {
new TableCell { Text = "SUBMITTED BY" },
new TableCell { Text = "ON" },
new TableCell { Text = "ISSUE DESCRIPTION" },
}
};
答案 1 :(得分:6)
您每次都需要重新创建iCell
,否则您将反复添加相同的实例并仅更改其文本。由于它们都是同一个实例,.Add(..)
操作会识别它并且不再添加它,因此在代码末尾的行中实际上只有一个单元格 - {{1 }}
这是一个应该正常工作的例子:
iCell
如果你想让你的代码更清洁,你可以创建一个辅助方法,返回一个新的单元格实例,其中包含为文本指定的参数:
TableRow iRow = new TableRow();
TableCell iCell = new TableCell();
iCell.Text = "SUBMITTED BY";
iRow.Cells.Add(iCell);
iCell = new TableCell(); // create new cell
iCell.Text = "ON";
iRow.Cells.Add(iCell);
iCell = new TableCell(); // create new cell
iCell.Text = "ISSUE DESCRIPTION";
iRow.Cells.Add(iCell);
table.Rows.Add(iRow);
然后您的代码可以简化为以下内容:
public TableCell CreateCell(string text) {
TableCell iCell = new TableCell();
iCell.Text = text;
return iCell;
}