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