19

在 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 列,如下所示: 来自 DataGridViewDesigner 的列

难道我做错了什么?我怎样才能完成我想做的事情?

4

5 回答 5

23

因此,为了完成您希望的方法,需要以这种方式完成:

//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;
于 2014-03-02T04:39:16.877 回答
4

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

row.Cells[dataGridView1.Columns["code"].Index].Value = product.Id;
于 2014-03-02T03:29:05.770 回答
3

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

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

于 2014-03-02T08:10:46.433 回答
0

问题是在将行添加到 DataGridView 之前,按名称引用单元格不起作用。在内部,它使用 DataGridViewRow.DataGridView 属性来获取列名,但在添加行之前该属性为空。

使用 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);
于 2018-04-23T18:15:58.117 回答
0

另一种选择:
假设您的 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);
于 2018-12-14T04:28:36.980 回答