Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 只有最后一个单元格被添加到行中_C#_Asp.net - Fatal编程技术网

C# 只有最后一个单元格被添加到行中

C# 只有最后一个单元格被添加到行中,c#,asp.net,C#,Asp.net,我试图手动将三个标题添加到一个表中。该表使用SqlDataReader中的数据填充得很好,但是我在保持第一行时遇到了问题 TableRow iRow = new TableRow(); TableCell iCell = new TableCell(); iCell.Text = "SUBMITTED BY"; iRow.Cells.Add(iCell); iCell.Text = "ON"; iRo

我试图手动将三个标题添加到一个表中。该表使用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


谢谢

每次都需要重新创建
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);
如果要使代码更简洁,可以创建一个helper方法,该方法返回一个新的单元格实例,并为文本指定一个参数:

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);
C中有我遗漏的东西吗#

听起来不错

这:

创建一个
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" },
    }
};
TableRow row = new TableRow {
    Cells = {
        new TableCell { Text = "SUBMITTED BY" },
        new TableCell { Text = "ON" },
        new TableCell { Text = "ISSUE DESCRIPTION" },
    }
};