3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.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 コラム