2012-04-18 8 views
4

私は手動でテーブルに3つのヘッダーを追加しようとしています。テーブルは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#を始めました。

ありがとうございます!

答えて

11

私はC#

の中に欠けているものがあるはい、それのように聞こえます。

これ:

TableCell iCell = new TableCell(); 

TableCellオブジェクトを作成し、iCell変数にまで参照を割り当てます。 iCellの値はであり、オブジェクトへの参照はただです。それはオブジェクトそのものではありません。これ:

iRow.Cells.Add(iCell); 

を通過参照そのAdd方法にAddにオブジェクトを渡しません.C#で決して行うことはできません。Addにオブジェクトを渡しません。だからあなたの行は、同じセルへの参照の多くで終わり、そしてあなたは、このような行で行ったすべての変更:彼らは同じオブジェクトに変更を作っているよう

iCell.Text = "ON"; 

だけで、お互いを上書きします。

あなたはこれらの記事が役立つことがあります。

個人的に私は、コレクション初期化子とオブジェクト初期化子を使用するようにコードを変更します

TableRow row = new TableRow { 
    Cells = { 
     new TableCell { Text = "SUBMITTED BY" }, 
     new TableCell { Text = "ON" }, 
     new TableCell { Text = "ISSUE DESCRIPTION" }, 
    } 
}; 
6

毎回iCellを再作成する必要があります。それ以外の場合は、同じインスタンスを何度も繰り返し追加してテキストを変更します。それらはすべて同じインスタンスであるため、操作はこれを認識して再度追加しないため、コードの最後の行に有効に1つのセル(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); 
関連する問題