web-dev-qa-db-ja.com

列名でDataGridViewRowのCell値を設定するにはどうすればよいですか?

Windowsフォームでは、DataGridViewを挿入して手動でDataGridViewRowsを埋めようとしているので、コードは次のようになります。

DataGridViewRow row = new DataGridViewRow();
row.CreateCells(dgvArticles);
row.Cells[0].Value = product.Id;
row.Cells[1].Value = product.Description;
.
.
.
dgvArticles.Rows.Add(row);

ただし、次のように、インデックスではなく列名でセル値を追加したいと思います。

row.Cells["code"].Value = product.Id;
row.Cells["description"].Value = product.Description;

しかし、そのように実行すると、「code」という名前の列が見つからなかったというエラーがスローされます。このようにデザイナーからDataGridView列を設定しています。 Columns from DataGridViewDesigner

私は何か間違っていますか?やりたいことをどのように達成できますか?

15
user2612401

したがって、希望するアプローチを実現するには、次のようにする必要があります。

//Create the new row first and get the index of the new row
int rowIndex = this.dataGridView1.Rows.Add();

//Obtain a reference to the newly created DataGridViewRow 
var row = this.dataGridView1.Rows[rowIndex];

//Now this won't fail since the row and columns exist 
row.Cells["code"].Value = product.Id;
row.Cells["description"].Value = product.Description;
17
Derek W

DataGridViewCellCollectionのColumnNameインデクサーを使用すると、内部でこのDataGridViewインスタンスの所有/親DataGridViewRowからColumnNameを使用して列インデックスを取得しようとします。あなたの場合、行はDataGridViewに追加されていないため、所有するDataGridViewはnullです。そのため、という名前の列が見つからなかったというエラーが表示されます。

IMOの最良のアプローチ(Derekの方法と同じ)は、DataGridViewに行を追加し、返されたインデックスを使用してグリッドから行インスタンスを取得し、列名を使用してセルにアクセスすることです。

3
Junaith

私も試してみて、同じ結果を得ました。これは少し冗長ですが、動作します:

row.Cells[dataGridView1.Columns["code"].Index].Value = product.Id;
3
Grant

問題は、名前でセルを参照することは、行がDataGridViewに追加されるまで機能しないことです。内部的には、DataGridViewRow.DataGridViewプロパティを使用して列名を取得しますが、行が追加されるまでそのプロパティはnullです。

C#7.0のローカル関数機能を使用して、コードを途中で読み取り可能にすることができます。

DataGridViewRow row = new DataGridViewRow();
row.CreateCells(dgvArticles);

DataGridViewCell CellByName(string columnName)
{
    var column = dgvArticles.Columns[columnName];
    if (column == null)
        throw new InvalidOperationException("Unknown column name: " + columnName);
    return row.Cells[column.Index];
}


CellByName("code").Value = product.Id;
CellByName("description").Value = product.Description;
.
.
.
dgvArticles.Rows.Add(row);
0
Timothy Klenke

別の選択肢:
DataGridViewの名前がdataGridView1であるとします。

var row = new DataGridViewRow();
// Initialize Cells for this row
row.CreateCells(_dataGridViewLotSelection);

// Set values
row.Cells[dataGridView1.Columns.IndexOf(code)].Value = product.Id;
row.Cells[dataGridView1.Columns.IndexOf(description)].Value = product.Description;
// Add this row to DataGridView
dataGridView1.Rows.Add(row);
0
Bravo Yeung