如何按列名设置DataGridViewRow的Cell值?

时间:2014-03-02 03:08:28

标签: c# winforms datagridview datagridviewrow

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

但是,我想按列名添加Cell值,而不是通过索引添加它,如下所示:

{{1}}

但是这样做会抛出错误,说它无法找到名为“code”的列。 我正在设计器中设置DataGridView列,如下所示: Columns from DataGridViewDesigner

我做错了吗?我怎样才能完成我想做的事?

5 个答案:

答案 0 :(得分:17)

所以为了完成你想要的方法,需要这样做:

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

答案 1 :(得分:3)

我也试过了,得到了同样的结果。这有点冗长,但它确实有效:

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

答案 2 :(得分:3)

当您使用DataGridViewCellCollection的ColumnName索引器时,它会在内部尝试使用此DataGridView实例的拥有/父DataGridViewRow中的ColumnName来获取列索引。在您的情况下,该行尚未添加到DataGridView,因此拥有的DataGridView为null。这就是为什么你得到的错误它找不到名为code的列。

IMO最好的方法(与Derek相同)是添加DataGridView中的行并使用返回的索引从网格中获取行实例,然后使用列名访问单元格

答案 3 :(得分:0)

问题是,在将行添加到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);

答案 4 :(得分:0)

另一种选择:
假设您的DataGridView的名称为 dataGridView1

'CPP'