IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

pb avec DataGridViewComboboxColumn


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 18
    Par défaut pb avec DataGridViewComboboxColumn
    Bonjour,

    J'essaie d'utiliser les DataGridViewComboboxColumn avec un objet (sruct) en item.
    Il n'y a pas de problème au remplissage, mais une erreur est généré lorsque j'y accède.
    Ca fonctionne évidemment très bien avec un Combobox classique.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    // La Structure ListItem
    public struct ListItem
    {
        public string LabelString;
        public string Constant;
        public ListItem(string labelString, string constant)
        {
            this.LabelString = labelString;
            this.Constant = constant;
        }
        public override string ToString()
        {
            return LabelString;
        }
    }
     
    private void Form1_Load(object sender, EventArgs e)
    {
        DataGridViewComboBoxColumn cbc0 = new DataGridViewComboBoxColumn();
        cbc0.Name = "cboVar";
        cbc0.HeaderText = "Variable";
        cbc0.Width = 120;
        cbc0.Items.Add(new ListItem("Un", "1"));
        cbc0.Items.Add(new ListItem("Deux", "2"));
        cbc0.Items.Add(new ListItem("Trois", "3"));
     
        dataGridView1.Columns.Insert(0, cbc0);
        cbc0.Dispose();
     
        DataGridViewComboBoxColumn cbc1 = new DataGridViewComboBoxColumn();
        cbc1.Name = "cboOpe";
        cbc1.HeaderText = "Opérateur";
        cbc1.Width = 80;
        cbc1.Items.Add(new ListItem("égal", "="));
        cbc1.Items.Add(new ListItem("supérieur", ">"));
        cbc1.Items.Add(new ListItem("inférieur", "<"));
        dataGridView1.Columns.Insert(1, cbc1);
        cbc1.Dispose();
    }
    Rien de bien compliqué...
    Et le message d'erreur quand on essaie de sélectionner une des lignes du 2ème combo alors que le choix du 1er a été fait :
    "L'exception suivante s'est produite dans le DataGridView :
    System.ArgumentException: La valeur DataGridViewComboBoxCell n'est pas valide.
    Pour remplacer cette boite de dialogue par défaut, traitez l'évènement DataError."

    Je ne comprends pas tout...
    Merci pour l'aide.
    RV

  2. #2
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Pourquoi est-ce que tu "dispose" tes colonnes ?

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 18
    Par défaut
    Euh... l'habitude de "disposer" les variables "locales".

    Quoiqu'il en soit, même pb sans le .Dispose().

  4. #4
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    Oui mais là tes colonnes ne sont pas locales, puisque tu viens de les ajouter à ta grille. est exactement identique à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dataGridView1.Columns[0].Dispose().
    Le nom "cbc0" est local, mais l'objet que tu as créé ne l'est pas, puisque tu en files une référence à ta grille.

    Mais ça n'a pas l'air d'être ton souci.

    Ta grille est bindée à quelque chose ? (DataTable, liste d'objets métier, ...) ?

  5. #5
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 18
    Par défaut
    J'ai trouvé une solution en modifiant ma structure et en indiquant les propriétés .DisplayMember et .ValueMember des dgvcbc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
            public struct ListItem2
            {
                public ListItem2(string label, string constant)
                {
                    this.labelValue = label;
                    this.constantValue = constant;
                }
                private string labelValue;
                private string constantValue;
                public String Label
                {
                    get { return labelValue; }
                    set { labelValue = value; }
                }
                public String Constant
                {
                    get { return constantValue; }
                    set { constantValue = value; }
                }
                public ListItem2 Self
                {
                    get { return this; }
                }
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
                DataGridViewComboBoxColumn cbc0 = new DataGridViewComboBoxColumn();
                cbc0.Name = "cboVar";
                cbc0.HeaderText = "Variable";
                cbc0.Width = 120;
                cbc0.Items.Add(new ListItem2("", ""));
                cbc0.Items.Add(new ListItem2("Un", "1"));
                cbc0.Items.Add(new ListItem2("Deux", "2"));
                cbc0.Items.Add(new ListItem2("Trois", "3"));
                cbc0.DisplayMember = "Label";
                cbc0.ValueMember = "Self";
                dataGridView1.Columns.Insert(0, cbc0);
     
                DataGridViewComboBoxColumn cbc1 = new DataGridViewComboBoxColumn();
                cbc1.Name = "cboOpe";
                cbc1.HeaderText = "Opérateur";
                cbc1.Width = 80;
                cbc1.Items.Add(new ListItem2("", ""));
                cbc1.Items.Add(new ListItem2("égal", "="));
                cbc1.Items.Add(new ListItem2("supérieur", ">"));
                cbc1.Items.Add(new ListItem2("inférieur", "<"));
                cbc1.DisplayMember = "Label";
                cbc1.ValueMember = "Self";
                dataGridView1.Columns.Insert(1, cbc1);
            }
    Un pb résolu en amenant un autre... j'ai maintenant le souci de récupérer la valeur sélectionnée manuellement dans le combo :
    Le dataGridView1_CellClick se déclenche bien au click sur la cellule (récupe des coordonnées), mais ne tient pas compte de la sélection faite dans le combo de cette cellule.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {
            string sValue = string.Empty;
            if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null) sValue = "NOT NULL";
            else sValue = "NULL";
            label1.Text = "CellClick (" + e.RowIndex + ", " + e.ColumnIndex + ", " + sValue + "):\n";
            if (dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value != null)
            {
                ListItem2 li = (ListItem2)dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
                label1.Text += "Constant='" + li.Constant + "'\n" + "Label='" + li.Label + "'\n";
            }
    }
    Idem pour le _CellMouseUp, _CellMouseClick, _CellContentClick, ...
    Qq'un aurait une petite astuce à donner ?

    L'idée serait qu'au changement de la valeur sélectionnée d'un combo d'une ligne du tableau je puisse remplir une cellule de la même ligne.

    Merci
    RV

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 109
    Par défaut
    Voici le code que je j'avais trouvé sur un post msdn pour ce type de problème, en gros avoir un event selectedItem sur ta colonne de type combo

    Sur ta grille abonne l'event EditingControlShowing :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    private void Magrid_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        {
          ComboBox combo = e.Control as ComboBox;
     
          // control de type combo 
          if (combo != null)
          {
            // first remove event handler to keep from attaching multiple:
            combo.SelectedIndexChanged -= new EventHandler(cmbGrid_SelectedIndexChanged);
     
            // now attach the event handler
            combo.SelectedIndexChanged += new EventHandler(cmbGrid_SelectedIndexChanged);
          }
        }
    Ensuite tu peux récupérer, l'objet sous-jacent sélectionné dans ta combo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    private void cmbGrid_SelectedIndexChanged(object sender, EventArgs e)
        {
          ComboBox combo = sender as ComboBox;
          ListItem2 item = combo.SelectedItem as ListItem2 ;
     
          if (item != null)
          {
            .......
            }
          }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pb avec DataGridViewComboBoxColumn à contenu variable
    Par olive-andre dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/05/2013, 12h45
  2. souci avec la classe DataGridViewComboBoxColumn
    Par yuriyan dans le forum Windows Forms
    Réponses: 0
    Dernier message: 13/11/2012, 15h38
  3. Réponses: 3
    Dernier message: 25/09/2012, 17h43
  4. Réponses: 0
    Dernier message: 21/01/2009, 12h23
  5. [C# 2.0] Problème avec DataGridViewComboBoxColumn
    Par Oberown dans le forum Windows Forms
    Réponses: 2
    Dernier message: 06/12/2006, 17h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo