web-dev-qa-db-fra.com

Comment définir la valeur de cellule de DataGridViewRow par nom de colonne?

Dans les formulaires Windows, j'essaie de remplir une DataGridView manuellement en y insérant DataGridViewRows, afin que mon code ressemble à ceci:

DataGridViewRow row = new DataGridViewRow();
row.CreateCells(dgvArticles);
row.Cells[0].Value = product.Id;
row.Cells[1].Value = product.Description;
.
.
.
dgvArticles.Rows.Add(row);

Cependant, j'aimerais ajouter la valeur de la cellule par nom de colonne au lieu de l'index, comme ceci:

row.Cells["code"].Value = product.Id;
row.Cells["description"].Value = product.Description;

Mais le faire comme cela jette une erreur en disant qu'il ne pouvait pas trouver la colonne nommée "code" . Je règle les colonnes DataGridView du concepteur comme ceci: Columns from DataGridViewDesigner

Est-ce que je fais quelque chose de mal? Comment puis-je accomplir ce que je veux faire?

14
user2612401

Donc, pour accomplir l'approche que vous désirez, il faudrait le faire de la manière suivante:

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

Lorsque vous utilisez l'indexeur ColumnName de DataGridViewCellCollection, il tente en interne d'obtenir l'index de colonne à l'aide de ColumnName de la propriété/parent DataGridView de cette instance DataGridViewRow. Dans votre cas, la ligne n'a pas été ajoutée à DataGridView et par conséquent, le propriétaire de DataGridView est null. C'est pourquoi vous obtenez l'erreur que Il n'a pas pu trouver la colonne nommée code.

IMO, la meilleure approche (identique à celle de Derek) serait d'ajouter la ligne dans la variable DataGridView et d'utiliser l'index renvoyé pour obtenir l'instance de ligne de la grille, puis utiliser le nom de colonne pour accéder aux cellules.

3
Junaith

J'ai aussi essayé et obtenu le même résultat. C'est un peu bavard, mais ça marche:

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

Le problème est que le référencement des cellules par nom ne fonctionne pas tant que la ligne n'est pas ajoutée à DataGridView. En interne, il utilise la propriété DataGridViewRow.DataGridView pour obtenir les noms de colonne, mais cette propriété est null jusqu'à ce que la ligne soit ajoutée.

En utilisant la fonction locale de C # 7.0, le code peut être rendu lisible à moitié.

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

Une autre alternative:
Supposons que le nom de votre DataGridView soit 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