只有最后一个Cell被添加到Row中

时间:2012-04-18 14:19:42

标签: c# asp.net

我正在尝试手动将三个标头添加到表格中。该表用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#。

谢谢!

2 个答案:

答案 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;
}