web-dev-qa-db-fra.com

Comment obtenir la valeur de cellule de DataGridView par nom de colonne?

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?

19
ca9163d9

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))
    {
        // ...
    }
 }
20
Patrick Quirk

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.

10
Richard Hansell

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"]
9
jj_

J'ai trouvé ça:

  1. Clic droit de la souris sur la vue de la grille de données.
  2. Sélectionnez dans le menu contextuel "Modifier les colonnes".
  3. Sélectionnez la colonne que vous souhaitez. Design/(Nom) - c'est ce que vous cherchiez.

Échantillon:

if(dataGridViewProjectList.Rows[dataGridViewProjectList.CurrentCell.RowIndex].Cells["dateendDataGridViewTextBoxColumn"].Value.ToString().Length == 0)
6
Serg

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
3
Kim Ki Won

Si vous regardez:

row.Cells["xxx"].Value;

Par ça :

row.Cells[yourdataGridView.Columns["xxx"].Index].Value;
0
Dominique Mathieu