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

最後のエントリ(この場合はISSUEDESCRIPTION)のみがテーブルに表示されます。で回避策を見つけました

        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#を始めたばかりです。

ありがとう!

4

2 に答える 2

11

C#で欠けているものはありますか

そのようですね、はい。

これ:

TableCell iCell = new TableCell();

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

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" },
    }
};
于 2012-04-18T14:23:52.323 に答える
6

iCell毎回再作成する必要があります。そうしないと、同じインスタンスを何度も追加し直し、そのテキストを変更するだけです。それらはすべて同じインスタンスであるため、.Add(..)操作はこれを認識し、再度追加することはありません。そのため、コードの最後の行には実質的に 1 つのセルしかありません。つまり、 の 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);
于 2012-04-18T14:22:17.333 に答える