2012-04-18 101 views
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); 

但它困扰我多少messier是。我的逻辑有问题吗,或者是我在C#中缺少的东西?我对C有个很好的处理,但几周前刚开始C#。

谢谢!

回答

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

如果你想使你的代码干净了一点,你可以创建一个返回与文中给出一个参数的新细胞实例的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); 
相关问题