最近、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 コラム