it-roy-ru.com

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

В окнах я пытаюсь заполнить 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

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

14
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;
15
Derek W

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

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

3
Junaith

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

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

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