人気ブログランキング | 話題のタグを見る
(.Net)DataGridViewRow作成時に列名指定で値を入れる

最近、DataGridViewRow.CreateCells()というメソッドを知りました。
これは既存の DataGridView の列定義に基づいてセル(正確にはセルテンプレート)を作成してくれるもので、新規DataGridViewの行を作るときに便利そうです。

それで、下記のようなコードを書いてみました。新たな DataGridViewRow を作成し、DataGridView に基づくセルテンプレート作成後、セルに値を入れグリッドにバインドするような流れです。(C#)
//dgvTest は DataGridViewのインスタンス
 
DataGridViewRow row = new DataGridViewRow();
row.CreateCells(dgvTest);
//列名指定で、セルに値代入
row.Cells["ColumnA"].Value = "a";
dgvInputPayList.Rows.Add(row);

上記のようにすると下記のような例外となりました。

System.ArgumentException はハンドルされませんでした。
Message="ColumnA という列は見つかりません。\r\nパラメータ名: columnName"
Source="System.Windows.Forms"
ParamName="columnName"

ただ、列名ではなく列のインデックスを指定すると可能なようです。
row.Cells[0].Value = "a";


で、とあるサイトを参考にすると、DataGridView に行を追加した後だとできるようです。
//dgvTest は DataGridViewのインスタンス
DataGridViewRow row = new DataGridViewRow();
row.CreateCells(dgvTest);
dgvInputPayList.Rows.Add(row);
row.Cells["ColumnA"].Value = "a";


しかし、上記だと2行目からがNGになります。
//dgvTest は DataGridViewのインスタンス
DataGridViewRow row = new DataGridViewRow();
row.CreateCells(dgvTest);
dgvInputPayList.Rows.Add(row);
row.Cells["ColumnA"].Value = "a";
 
DataGridViewRow row2 = new DataGridViewRow();
row2.CreateCells(dgvTest);
dgvInputPayList.Rows.Add(row2);
row2.Cells["ColumnA"].Value = "b";


System.ArgumentOutOfRangeException はハンドルされませんでした。
Message="指定された引数は、有効な値の範囲内にありません。\r\nパラメータ名: rowIndex"
Source="System.Windows.Forms"
ParamName="rowIndex"

どうやら、行のインデックスがまずいらしいです。


結局行を追加した後に、DataGridViewの行に対して、値を指定するようにしました。
//dgvTest は DataGridViewのインスタンス
DataGridViewRow row = new DataGridViewRow();
row.CreateCells(dgvTest);
int i = dgvInputPayList.Rows.Add(row);
dgvInputPayList["ColumnA", i].Value = "a";


参考:
DataGridViewコントロールを操作する101の方法 / DevX - japan.internet.com コラム
by jehoshaphat | 2010-05-02 13:04 | .Net開発


<< 共有フォルダ上のバッチファイル... (.Net,ADSI)OUを取... >>