只有最后一个单元格会被添加到行中。

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);

仅导致最后一个条目,即问题描述,在表格上显示。 我已经找到了一种解决方法

        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个回答

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" },
    }
};

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接