2012-04-18 144 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); 
相關問題