Как установить значение ячейки DataGridViewRow по имени столбца?

в windows forms я пытаюсь заполнить 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;

но делать это так, что выдает ошибку, говоря, что он не может найти столбец с именем "код". Я установка колонок datagridview из такой конструктор : Columns from DataGridViewDesigner

Я что-то делаю не так? Как я могу добиться того, чего хочу?

4 ответов


Итак, чтобы выполнить желаемый вами подход, его нужно было бы сделать следующим образом:

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

при использовании индексатора ColumnName DataGridViewCellCollection, внутренне он пытается получить индекс столбца, используя ColumnName от владельца / родителя DataGridView этой DataGridViewRow экземпляра. В вашем случае строка не была добавлена в DataGridView и, следовательно, владеющий DataGridView равен null. Вот почему вы получаете ошибку, что Он не смог найти столбец с именем code.

IMO лучшим подходом (таким же, как у Дерека) было бы добавить строку в DataGridView и использовать возвращает индекс для получения экземпляра строки из сетки, а затем использует имя столбца для доступа к ячейкам.


Я тоже попробовал и получил тот же результат. Это немного многословно, но это работает:

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

проблема в том, что ссылка на ячейки по имени не работает, пока строка не будет добавлена в 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);