webentwicklung-frage-antwort-db.com.de

Wie man den Zellenwert von DataGridViewRow nach Spaltennamen setzt?

In Windows-Formularen versuche ich, eine DataGridView manuell auszufüllen, indem Sie DataGridViewRows einfügen, sodass mein Code folgendermaßen aussieht:

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

Ich möchte jedoch den Zellenwert über den Spaltennamen hinzufügen, anstatt ihn über den Index zu tun, etwa wie folgt:

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

Wenn Sie dies so tun, wird ein Fehler ausgegeben, der besagt, dass die Spalte mit dem Namen "code" nicht gefunden werden konnteColumns from DataGridViewDesigner

Mache ich etwas falsch? Wie kann ich erreichen, was ich tun möchte?

14
user2612401

Um die gewünschte Vorgehensweise zu erreichen, muss dies auf folgende Weise geschehen:

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

Wenn Sie den ColumnName-Indexer von DataGridViewCellCollection verwenden, versucht er intern, den Spaltenindex mithilfe des ColumnName von der besitzenden/übergeordneten DataGridView dieser DataGridViewRow-Instanz abzurufen. In Ihrem Fall wurde die Zeile nicht zur DataGridView hinzugefügt, und daher ist die besitzende DataGridView leer. Deshalb erhalten Sie den Fehler, dass die Spalte namens code nicht finden konnte.

IMO Der beste Ansatz (der gleiche wie bei Derek) wäre, die Zeile in der Variablen DataGridView hinzuzufügen und den zurückgegebenen Index zu verwenden, um die Zeileninstanz aus dem Raster zu holen, und dann mit dem Spaltennamen auf die Zellen zugreifen.

3
Junaith

Ich habe es auch probiert und das gleiche Ergebnis erzielt. Dies ist ein wenig ausführlich, aber es funktioniert:

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

Das Problem ist, dass das Referenzieren von Zellen nach Namen erst funktioniert, wenn die Zeile zur DataGridView hinzugefügt wird. Intern wird die DataGridViewRow.DataGridView-Eigenschaft verwendet, um die Spaltennamen abzurufen. Diese Eigenschaft ist jedoch NULL, bis die Zeile hinzugefügt wird.

Mit der lokalen Funktionsfunktion von C # 7.0 kann der Code halb lesbar gemacht werden.

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

Eine andere Alternative:
Angenommen, der Name Ihrer DataGridView lautet 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