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

Windows Forms Discussion :

pb avec DataGridViewComboBoxColumn à contenu variable


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 72
    Par défaut pb avec DataGridViewComboBoxColumn à contenu variable
    Bonjour

    Je cherche à construire un écran contenant un dataGridView avec deux colonnes
    • La première contient un type d'information.
    • La seconde contient est une combobox

    Lorsque je sélectionne une ligne, je voudrais changer le contenu de la combo en fonction du type d'information (colonne 1).
    Ainsi, sur la ligne des couleurs, je peux choisir une couleur, sur la ligne des tailles, je choisis une taille, etc...

    Je n'arrive pas à faire fonctionner le code suivant car le contenu de toute la colonne combo change alors que je ne veux changer que le contenu de la combo localement à la ligne en cours (pas très clair ? regardez le code ci-dessous... surtout le second) :

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
       partial class Form1
        {
            /// <summary>
            /// Variable nécessaire au concepteur.
            /// </summary>
            private System.ComponentModel.IContainer components = null;
     
            /// <summary>
            /// Nettoyage des ressources utilisées.
            /// </summary>
            /// <param name="disposing">true si les ressources managées doivent être supprimées*; sinon, false.</param>
            protected override void Dispose( bool disposing )
            {
                if ( disposing && ( components != null ) )
                {
                    components.Dispose( );
                }
                base.Dispose( disposing );
            }
     
            #region Code généré par le Concepteur Windows Form
     
            /// <summary>
            /// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
            /// le contenu de cette méthode avec l'éditeur de code.
            /// </summary>
            private void InitializeComponent( )
            {
                this.dataGridView1 = new System.Windows.Forms.DataGridView( );
                this.columnParam = new System.Windows.Forms.DataGridViewTextBoxColumn( );
                this.columnValue = new System.Windows.Forms.DataGridViewComboBoxColumn( );
                ( (System.ComponentModel.ISupportInitialize) ( this.dataGridView1 ) ).BeginInit( );
                this.SuspendLayout( );
                // 
                // dataGridView1
                // 
                this.dataGridView1.AllowUserToAddRows = false;
                this.dataGridView1.AllowUserToDeleteRows = false;
                this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
                this.dataGridView1.Columns.AddRange( new System.Windows.Forms.DataGridViewColumn[ ] {
                this.columnParam,
                this.columnValue} );
                this.dataGridView1.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter;
                this.dataGridView1.Location = new System.Drawing.Point( 12, 12 );
                this.dataGridView1.Name = "dataGridView1";
                this.dataGridView1.RowHeadersVisible = false;
                this.dataGridView1.Size = new System.Drawing.Size( 578, 219 );
                this.dataGridView1.TabIndex = 0;
                this.dataGridView1.DataError += new System.Windows.Forms.DataGridViewDataErrorEventHandler( this.dataGridView1_DataError );
                this.dataGridView1.RowEnter += new System.Windows.Forms.DataGridViewCellEventHandler( this.dataGridView1_RowEnter );
                // 
                // columnParam
                // 
                this.columnParam.HeaderText = "Paramètre";
                this.columnParam.Name = "columnParam";
                this.columnParam.ReadOnly = true;
                this.columnParam.Width = 300;
                // 
                // columnValue
                // 
                this.columnValue.HeaderText = "Valeurs";
                this.columnValue.Name = "columnValue";
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF( 6F, 13F );
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                this.ClientSize = new System.Drawing.Size( 602, 243 );
                this.Controls.Add( this.dataGridView1 );
                this.Name = "Form1";
                this.Text = "Form1";
                ( (System.ComponentModel.ISupportInitialize) ( this.dataGridView1 ) ).EndInit( );
                this.ResumeLayout( false );
     
            }
     
            #endregion
     
            private System.Windows.Forms.DataGridView dataGridView1;
            private System.Windows.Forms.DataGridViewTextBoxColumn columnParam;
            private System.Windows.Forms.DataGridViewComboBoxColumn columnValue;
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
        public partial class Form1 : Form
        {
            private String[ ] listeCouleurs;
            private String[ ] listeTailles;
            private String[ ] listeTypes;
     
            public Form1( )
            {
                InitializeComponent( );
                InitScreen( );
            }
     
            private void InitScreen( )
            {
                int nRow;
                nRow = this.dataGridView1.Rows.Add( );
                this.dataGridView1.Rows[ nRow ].Cells[ 0 ].Value = "Couleur";
                nRow = this.dataGridView1.Rows.Add( );
                this.dataGridView1.Rows[ nRow ].Cells[ 0 ].Value = "Taille";
                nRow = this.dataGridView1.Rows.Add( );
                this.dataGridView1.Rows[ nRow ].Cells[ 0 ].Value = "Type";
     
                listeCouleurs = new String[ 3 ];
                listeTailles = new String[ 3 ];
                listeTypes = new String[ 3 ];
     
                listeCouleurs[ 0 ] = "Blanc";
                listeCouleurs[ 1 ] = "Rouge";
                listeCouleurs[ 2 ] = "Noir";
                listeTailles[ 0 ] = "Petit";
                listeTailles[ 1 ] = "Moyen";
                listeTailles[ 2 ] = "Grand";
                listeTypes[ 0 ] = "Voiture";
                listeTypes[ 1 ] = "Vélo";
                listeTypes[ 2 ] = "Avion";
            }
     
            private void dataGridView1_RowEnter( object sender, DataGridViewCellEventArgs e )
            {
                this.columnValue.Items.Clear( );
                if ( this.dataGridView1.Rows[ e.RowIndex ].Cells[ 0 ].Value.Equals( "Couleur" ) )
                {
                    foreach ( String item in listeCouleurs )
                    {
                        this.columnValue.Items.Add( item );
                    }
                }
                else if ( this.dataGridView1.Rows[ e.RowIndex ].Cells[ 0 ].Value.Equals( "Taille" ) )
                {
                    foreach ( String item in listeTailles )
                    {
                        this.columnValue.Items.Add( item );
                    }
                }
                else if ( this.dataGridView1.Rows[ e.RowIndex ].Cells[ 0 ].Value.Equals( "Type" ) )
                {
                    foreach ( String item in listeTypes )
                    {
                        this.columnValue.Items.Add( item );
                    }
                }
            }
     
            private void dataGridView1_DataError( object sender, DataGridViewDataErrorEventArgs e )
            {
     
            }
        }
    InitScreen prépare le dataGridView et construit les tableaux contenant les différentes valeurs à afficher dans la colonne combo
    Sur l'événement RowEnter, je change le contenu de la combo colonne en fonction du type (Couleur, taille ou type) <-- je pense que c'est la que cela ne va pas

    Maintenant, supposons que sur la ligne couleur, je choisisse la 1ière valeur (Blanc), puis, lorsque le clique sur la ligne suivante. J'ai bien toujours la 1ière valeur affichée sur la première ligne mais, elle affiche (Petit) au lieu de la couleur !

    Je pense que je ne devrais pas changer le contenu de la colonne combo, mais je ne vois pas comment faire autrement...

    Ha ! Autre chose, j'ai du trapper l'événement DataError, sans lequel, j'ai en permanence des erreurs.

    Ce pb n'est pas monstrueux, je sais le résoudre dans d'autre langage.. mais avec .Net, je n'y arrive pas
    Si vous avez des idées, je suis preneur

    D'avance merci de votre aide
    Oliv

  2. #2
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Essaye ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void dataGridView1_RowEnter( object sender, DataGridViewCellEventArgs e )
    {
       DataGridViewRow row= dataGridView1.Rows[e.RowIndex] ;
       switch ((string)row.Cells[0].Value)
       {
          case "Couleur" : ((DataGridViewComboBoxCell)row.Cells[1]).DataSource= ListeCouleurs ; break ; 
          case "Taille"  :  ...
        }
    }

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    Pourquoi ne renseignez vous pas les cellules ComboBox dans le InitScreen ?
    Genre :
    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
                int nRow;
                nRow = this.dataGridView1.Rows.Add();
                this.dataGridView1.Rows[nRow].Cells[0].Value = "Couleur";
                DataGridViewComboBoxCell dcCouleurs = (DataGridViewComboBoxCell)this.dataGridView1.Rows[nRow].Cells[1];
                dcCouleurs.Items.AddRange(listeCouleurs); 
     
                nRow = this.dataGridView1.Rows.Add();
                this.dataGridView1.Rows[nRow].Cells[0].Value = "Taille";
                DataGridViewComboBoxCell dcTailles = (DataGridViewComboBoxCell)this.dataGridView1.Rows[nRow].Cells[1];
                dcTailles.Items.AddRange(listeTailles); 
     
                nRow = this.dataGridView1.Rows.Add();
                this.dataGridView1.Rows[nRow].Cells[0].Value = "Type";
                DataGridViewComboBoxCell dcTypes = (DataGridViewComboBoxCell)this.dataGridView1.Rows[nRow].Cells[1];
                dcTypes.Items.AddRange(listeTypes);

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 72
    Par défaut pb avec DataGridViewComboBoxColumn à contenu variable
    Merci à vous deux
    Vous m'enlevez une bonne épine du pied

    Je vais adopter l'idée de chrismonoye, elle n'est à éxecuter qu'une seule fois.

    Dernière question : quelle est la différence dans ce contexte entre l'utilisation de Items à laquelle on affecte un tableau de DataSource à laquelle on affecte aussi un tableau ?

    Je reviendrais peut-être plus tard avec une autre question sur les combos en cascade dans une DataGridView, mais il est possible qu'elle se règle toute seule avec ce que vous venez de me montrer !

    Merci de votre aide
    Oliv

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Je vais adopter l'idée de chrismonoye, elle n'est à éxecuter qu'une seule fois.
    C'est effectivement la bonne solution si la DataGridView n'est jamais modifiée après son chargement.

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

Discussions similaires

  1. Programmer un menu de filtres avec un contenu variable
    Par Elisa_ dans le forum Composants graphiques
    Réponses: 6
    Dernier message: 21/03/2013, 12h04
  2. Listbox avec contenu variable
    Par mfmf99 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/11/2008, 15h02
  3. executer une requete avec le contenu d'une variable
    Par giloo(94) dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 03/02/2007, 01h58
  4. Réponses: 7
    Dernier message: 04/10/2006, 15h45
  5. Réponses: 13
    Dernier message: 30/05/2006, 16h00

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