Как установить значение ячейки 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);
Однако я хотел бы добавить значение Cell по имени столбца вместо того, чтобы делать это по индексу, примерно так:
row.Cells["code"].Value = product.Id;
row.Cells["description"].Value = product.Description;
Но, делая это, это вызывает ошибку, говоря, что он не смог найти столбец с именем "code".
Я устанавливаю столбцы DataGridView из конструктора следующим образом:
![Columns from DataGridViewDesigner]()
Я что-то делаю неправильно? Как я могу выполнить то, что хочу?
Ответы
Ответ 1
Итак, чтобы выполнить подход, который вы пожелаете, это нужно будет сделать следующим образом:
//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;
Ответ 2
Я тоже попробовал и получил тот же результат. Это немного подробный, но он работает:
row.Cells[dataGridView1.Columns["code"].Index].Value = product.Id;
Ответ 3
Когда вы используете индексатор столбцов столбца DataGridViewCellCollection
, он пытается получить индекс столбца с помощью столбца ColumnName из владельца/родителя DataGridView
этого экземпляра DataGridViewRow
. В вашем случае строка не добавлена в DataGridView, и, следовательно, собственный DataGridView имеет значение null. Вот почему вы получаете сообщение об ошибке Не удалось найти столбец с именем code.
IMO наилучшим подходом (таким же, как Derek's) было бы добавить строку в DataGridView
и использовать возвращаемый индекс для получения экземпляра строки из сетки, а затем использовать имя столбца для доступа к ячейкам.
Ответ 4
Проблема в том, что ссылка на ячейки по имени не работает, пока строка не добавлена в DataGridView. Внутренне он использует свойство DataGridViewRow.DataGridView для получения имен столбцов, но это свойство является нулевым, пока не будет добавлена строка.
Используя функцию локальной функции С# 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);
Ответ 5
Другая альтернатива:
Предположим, что имя вашего 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);