4

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

谢谢!

4

2 回答 2

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" },
    }
};
于 2012-04-18T14:23:52.323 回答
6

iCell您每次都需要重新创建,否则您将一遍又一遍地重新添加相同的实例并且只是更改其文本。由于它们都是同一个实例,因此.Add(..)操作会识别它并且不会再次添加它,因此在代码末尾的行中实际上仍然只有一个单元格 - 的单个实例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;
}

然后您的代码可以简化为以下内容:

TableRow iRow = new TableRow();
iRow.Cells.Add(CreateCell("SUBMITTED BY"));
iRow.Cells.Add(CreateCell("ON"));
iRow.Cells.Add(CreateCell("ISSUE DESCRIPTION"));
table.Rows.Add(iRow);
于 2012-04-18T14:22:17.333 回答