J'ai une application WinForms avec un DataGridView
, dont DataSource est un DataTable (rempli à partir de SQL Server) qui a une colonne de xxx
. Le code suivant lève l'exception de
ArgumentException n'a pas été gérée. La colonne nommée xxx est introuvable.
foreach (DataGridViewRow row in Rows)
{
if (object.Equals(row.Cells["xxx"].Value, 123))
}
Est-il possible d'obtenir les valeurs des cellules par nom de colonne?
Les objets DataGridViewColumn
ont une propriété Name
(affichée uniquement dans le concepteur de formulaires) et une propriété HeaderText
(affichée dans l'interface graphique en haut de la colonne). L'indexeur de votre exemple utilise la propriété Name
de la colonne, donc puisque vous dites que cela ne fonctionne pas, je suppose que vous essayez vraiment d'utiliser l'en-tête de la colonne.
Il n'y a rien de intégré qui fait ce que vous voulez, mais c'est assez facile à ajouter. J'utiliserais une méthode d'extension pour le rendre facile à utiliser:
public static class DataGridHelper
{
public static object GetCellValueFromColumnHeader(this DataGridViewCellCollection CellCollection, string HeaderText)
{
return CellCollection.Cast<DataGridViewCell>().First(c => c.OwningColumn.HeaderText == HeaderText).Value;
}
}
Et puis dans votre code:
foreach (DataGridViewRow row in Rows)
{
if (object.Equals(row.Cells.GetCellValueFromColumnHeader("xxx"), 123))
{
// ...
}
}
Oui, il suffit de supprimer les guillemets et d'ajouter .Index, c'est-à-dire.
foreach (DataGridViewRow row in Rows)
{
if (object.Equals(row.Cells[xxx.Index].Value, 123))
... c'est-à-dire si votre colonne s'appelle vraiment xxx et pas un autre nom comme Colonne1, etc. Vous pouvez définir le nom de la colonne et l'en-tête de la colonne de manière indépendante, alors vérifiez dans le concepteur.
En faisant cela, vous pourrez accéder à la cellule au nom de la colonne "xxx" pour la ligne actuellement sélectionnée.
dataGridView1.SelectedRows[0].Cells["xxx"]
J'ai trouvé ça:
Échantillon:
if(dataGridViewProjectList.Rows[dataGridViewProjectList.CurrentCell.RowIndex].Cells["dateendDataGridViewTextBoxColumn"].Value.ToString().Length == 0)
si vous grillez la colonne en mode conception. alors le nom de la colonne était gridView ~~~ Exemple de nom des contrôles de colonne:
DataGridViewTextBoxColumn idDataGridViewTextBoxColumn = new DataGridViewTextBoxColumn();
idDataGridViewTextBoxColumn.Name = "idDataGridViewTextBoxColumn";
alors vous pouvez accéder à ce droit, vous voulez.
row.Cells["idDataGridViewTextBoxColumn"].Value
Si vous regardez:
row.Cells["xxx"].Value;
Par ça :
row.Cells[yourdataGridView.Columns["xxx"].Index].Value;