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 :

Combobox dans un datagridview [Débutant]


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Par défaut Combobox dans un datagridview
    Bonjour a tous,

    Je souhaiterai créer une combobox dans un datagridview. J'ai essayé de plusieurs manière d'implémenter cela (créer une var list<>,créer une arraylist, ect...) mais aucune ne fonctionne. Le truc c'est que ma colonne combobox existe, j'ai réussi a la créer donc y a pas de soucis la-dessus. Mais la combobox est grisée et vide. Je ne peux pas cliquer dessus, ni la dérouler. J'ai essayer de modifier ses propriétés (Enabled = true, Debug qui montre que ma liste contient bien les éléments, ect..).

    Merci !

    Mon 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
    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    public partial class Repair : Form
        {
     
     
            public Repair()
            {
                Main pp = new Main();
     
                InitializeComponent();
                this.label4.Text = pp.label3.Text;
     
                SqlConnection maConnexion = new SqlConnection("Server= localhost; Database= Seica_Takaya;Integrated Security = SSPI; ");
                maConnexion.Open();
                SqlCommand command = maConnexion.CreateCommand();
                SqlCommand command1 = maConnexion.CreateCommand();
     
                if (Program.UserType == "admin")
                {
                    command.CommandText = "SELECT Message, FComponent, ReadValue, ValueReference,  RepairingTime FROM FailAndPass WHERE FComponent IS NOT NULL";
                    command1.CommandText = "SELECT Machine, BoardName, BoardNumber FROM FailAndPass WHERE FComponent IS NOT NULL";
     
                }
                else
                {
                    command.CommandText = "SELECT Message, FComponent, ReadValue, ValueReference,  RepairingTime FROM FailAndPass WHERE ReportingOperator IS NULL AND FComponent IS NOT NULL";
                    command1.CommandText = "SELECT Machine, BoardName, BoardNumber FROM FailAndPass WHERE ReportingOperator IS NULL AND FComponent IS NOT NULL";
     
                }
     
                SqlDataAdapter sda = new SqlDataAdapter(command);
                SqlDataAdapter sda1 = new SqlDataAdapter(command1);
                DataTable dt = new DataTable();
                DataTable dt1 = new DataTable();
                sda.Fill(dt);
                sda1.Fill(dt1);
     
                DataColumn dcIsDirty = new DataColumn("IsDirty", typeof(bool));
                DataColumn dcIsDirty1 = new DataColumn("IsDirty", typeof(bool));
                dcIsDirty.DefaultValue = false;
                dcIsDirty1.DefaultValue = false;
     
                dataGridView1.DataSource = dt;
                dataGridView2.DataSource = dt1;
     
     
                DataGridViewComboBoxColumn combo = new DataGridViewComboBoxColumn();
     
     
                ArrayList list1 = new ArrayList(); //{ "C-C", "C-O", "Absence composant", "Mauvaise valeur", "Mauvais sens", "Mauvais composant" };
                list1.Add("C-C");
                list1.Add("C-O");
     
     
                combo.DataSource = list1;
                combo.HeaderText = "FaultCodeByOp";
                combo.DataPropertyName = "FaultCodeByOp";
     
     
                dataGridView1.Columns.AddRange(combo);
     
     
                dt.Columns.Add(dcIsDirty);
                dt1.Columns.Add(dcIsDirty1);
     
                dataGridView1.AllowUserToAddRows = false;
                dataGridView1.AllowUserToDeleteRows = false;
                dataGridView1.AllowUserToOrderColumns = true;
     
     
     
                maConnexion.Close();
     
                dataGridView1.Columns[6].Visible = false;
                dataGridView2.Columns[3].Visible = false;
     
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    for(int i=0;i<4;i++)
                    {
                        dataGridView1.Columns[i].ReadOnly = true;
     
                    }
                }
                foreach (DataGridViewRow row in dataGridView2.Rows)
                {
                    for(int i=0;i<3;i++)
                    {
                        dataGridView2.Columns[i].ReadOnly = true;
                    }
                }
     
     
     
     
            }
     
            private DataTable GetDescriptionTable()
            {
                DataTable l_dtDescription = new DataTable();
                l_dtDescription.Columns.Add("FaultCodeByOp", typeof(string));
     
                l_dtDescription.Rows.Add("C-O");
                l_dtDescription.Rows.Add("C-C");
                l_dtDescription.Rows.Add("Absence de composant");
                l_dtDescription.Rows.Add("Mauvais composant");
                l_dtDescription.Rows.Add("Mauvais sens");
                l_dtDescription.Rows.Add("Mauvaise valeur");
     
                return l_dtDescription;
            }
     
     
     
     
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
     
     
                SqlConnection maConnexion = new SqlConnection("Server= localhost; Database= Seica_Takaya;Integrated Security = SSPI; ");
                maConnexion.Open();
                string Var1 = textBox1.Text;
                SqlCommand command = maConnexion.CreateCommand();
                SqlCommand command1 = maConnexion.CreateCommand();
     
     
                if (Program.UserType == "admin")
                {
                    if (textBox1.Text != String.Empty)
                    {
     
                        //command.Parameters.AddWithValue("@BoardName", Var1 + "%");
                        //command.Parameters.AddWithValue("@Machine", Var1 + "%");
                        command.Parameters.AddWithValue("@SerialNum", Var1 + "%");
                        command1.Parameters.AddWithValue("@SerialNum", Var1 + "%");
                        //command.Parameters.AddWithValue("@FComponent", Var1 + "%");
                        //command.CommandText = "SELECT * FROM FailAndPass WHERE BoardName LIKE @BoardName OR Machine LIKE @Machine OR SerialNum LIKE @SerialNum OR FComponent LIKE @FComponent";
     
                        command.CommandText = "SELECT Message, FComponent, ReadValue, ValueReference, FaultCodeByOp, RepairingTime FROM FailAndPass WHERE SerialNum LIKE @SerialNum AND FComponent IS NOT NULL";
                        command1.CommandText = "SELECT Machine, BoardName, BoardNumber FROM FailAndPass WHERE SerialNum LIKE @SerialNum And FComponent IS NOT NULL";
                    }
                }
                else
                {
                    if (textBox1.Text != String.Empty)
                    {
     
                        //command.Parameters.AddWithValue("@BoardName", Var1 + "%");
                        //command.Parameters.AddWithValue("@Machine", Var1 + "%");
                        command.Parameters.AddWithValue("@SerialNum", Var1 + "%");
                        command1.Parameters.AddWithValue("@SerialNum", Var1 + "%");
                        //command.Parameters.AddWithValue("@FComponent", Var1 + "%");
                        //command.CommandText = "SELECT * FROM FailOnly WHERE (BoardName LIKE @BoardName OR Machine LIKE @Machine OR SerialNum LIKE @SerialNum OR FComponent LIKE @FComponent) AND ReportingOperator IS NULL  ";
                        command.CommandText = "SELECT Message, FComponent, ReadValue, ValueReference, FaultCodeByOp, RepairingTime FROM FailAndPass WHERE  (SerialNum LIKE @SerialNum) AND ReportingOperator IS NULL AND FComponent IS NOT NULL  ";
                        command1.CommandText = "SELECT DISTINCT Machine, BoardName, BoardNumber FROM FailAndPass WHERE (SerialNum LIKE @SerialNum) AND ReportingOperator IS NULL AND FComponent IS NOT NULL";
                    }
                }
     
                if (!string.IsNullOrWhiteSpace(textBox1.Text))
                {
     
                    SqlDataAdapter sda = new SqlDataAdapter(command);
                    SqlDataAdapter sda1 = new SqlDataAdapter(command1);
                    DataTable dt = new DataTable();
                    DataTable dt1 = new DataTable();
                    sda.Fill(dt);
                    sda1.Fill(dt1);
     
                    DataColumn dcIsDirty = new DataColumn("IsDirty", typeof(bool));
                    DataColumn dcIsDirty1 = new DataColumn("IsDirty", typeof(bool));
                    dcIsDirty.DefaultValue = false;
                    dcIsDirty1.DefaultValue = false;
                    dt.Columns.Add(dcIsDirty);
                    dt1.Columns.Add(dcIsDirty1);
     
                    dataGridView1.DataSource = dt;
                    dataGridView2.DataSource = dt1;
                    maConnexion.Close();
     
                    dataGridView1.Columns[6].Visible = false;
                    dataGridView2.Columns[3].Visible = false;
     
                }
     
            }
     
     
            private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
            {
     
                if (dataGridView1.IsCurrentRowDirty)
                {
                    dataGridView1.Rows[e.RowIndex].Cells[6].Value = true;
                }
     
            }
     
            private void metroButton1_Click(object sender, EventArgs e)
            {
                SqlConnection maConnexion = new SqlConnection("Server= localhost; Database= Seica_Takaya;Integrated Security = SSPI; ");
                maConnexion.Open();
     
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
     
     
                    if ((row.Cells[6].Value != null) && (bool)row.Cells[6].Value)
                    {
     
                        SqlCommand command = maConnexion.CreateCommand();
                        command = new SqlCommand("update FailAndPass set FaultCodeByOp=@Fault, RepairingDate=@RD, RepairingTime = @RT, ReportingOperator=@RO WHERE SerialNum=@Serial", maConnexion);
                        command.Parameters.AddWithValue("@Fault", row.Cells[4].Value != null ? row.Cells[4].Value : DBNull.Value);
                        command.Parameters.AddWithValue("@RD", DateTime.Today.ToString("d"));
                        command.Parameters.AddWithValue("@RT", row.Cells[5].Value != null ? row.Cells[5].Value : DBNull.Value);
                        command.Parameters.AddWithValue("@RO", this.label4.Text);
                        command.Parameters.AddWithValue("@Serial", this.textBox1.Text);
                        command.ExecuteNonQuery();
     
     
                    }
                }
     
     
     
                maConnexion.Close();
                this.Hide();
                Repair rep = new Repair();
                rep.Show();
     
            }
     
            private void metroButton2_Click(object sender, EventArgs e)
            {
                this.Hide();
                Main ff = new Main();
                ff.Show();
     
            }
     
            /**private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                
                    if (e.ColumnIndex > -1)
                    {
                        // Bind grid cell with combobox and than bind combobox with datasource.  
                        DataGridViewComboBoxCell l_objGridDropbox = new DataGridViewComboBoxCell();
     
                        // Check the column  cell, in which it click.  
                        if (dataGridView1.Columns[e.ColumnIndex].Name.Contains("FaultCodeByOp"))
                        {
                            // On click of datagridview cell, attched combobox with this click cell of datagridview  
                            dataGridView1[e.ColumnIndex, e.RowIndex] = l_objGridDropbox;
                            l_objGridDropbox.DataSource = GetDescriptionTable(); // Bind combobox with datasource.  
                            l_objGridDropbox.ValueMember = "FaultCodeByOp";
                            l_objGridDropbox.DisplayMember = "FaultCodeByOp";
     
                        }
     
                        
                    }
     
             }**/
           }

  2. #2
    Membre très actif
    Homme Profil pro
    Autodidacte
    Inscrit en
    Mars 2016
    Messages
    154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2016
    Messages : 154
    Par défaut
    bonjour,
    regardes un peu le lien https://msdn.microsoft.com/fr-fr/lib...v=vs.110).aspx si cela peut t'aider.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Par défaut
    J'ai déjà essayer les comboboxcolumn et comboboxcolumncell, ca ne change rien au problèmes :/

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Par défaut
    Up ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Par défaut
    Personne ?

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Bonjour,

    J'ai lu la page de la doc passé en lien par prisson, et j'ai remarqué que tu n'appliquais pas les recommandations données par la doc ... à partir de la ça donne pas envie de t'aider quand meme la doc n'est pas appliquée.
    Je parle notamment de
    Vous pouvez remplir la liste déroulante des colonnes manuellement en ajoutant des valeurs à la Items collection. Vous pouvez également lier la liste déroulante à sa propre source de données en définissant la colonne DataSource propriété. Si les valeurs sont des objets dans une collection ou des enregistrements dans une table de base de données, vous devez également définir le DisplayMember et ValueMember Propriétés. Le DisplayMember propriété indique quelle colonne de base de données ou de la propriété objet fournit les valeurs qui sont affichent dans la liste déroulante. Le ValueMember propriété indique quelle colonne de base de données ou de la propriété objet est utilisé pour définir la cellule Value propriété.
    Du coup je vais pas plus loin, pas dit que ce soit ton problème, mais généralement suivre la doc c'est un bon début

    Bon code,
    J@ck.

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Par défaut
    J'ai résolu le problème. Effectivement, ca n'a rien a voir avec tout ca. Mes bindings, datasource sont définis correctement. DisplayMember me servait a rien et ne changeait rien a mon problème, pareil pour ValueMember. J'ai tout testé. Rien n'y faisait.

    Maintenant, la solution au problème :

    J'ai du remplacé ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        for (int i = 0; i < 4; i++)
        {
            dataGridView1.Columns[i].ReadOnly = true;
     
        }
    }
    par ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        for (int i = 0; i < 4; i++)
        {
            if (!(dataGridView1.Columns[i] is DataGridViewComboBoxColumn))
            {
                dataGridView1.Columns[i].ReadOnly = true;
            }
     
        }
    }
    Pourquoi ? J'en sais strictement rien car de base je dis au datagridview que toute les columns avant celle d'indice 4, ne sont pas modifiable ect.. et que toutes les colonnes après celle d'indice 4 soit modifiable. Donc premier cas : readOnly = true; deuxième cas : readOnly = false.

  8. #8
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Ok.

    C'est bizarre que tu passes par les cellules pour jouer sur le readonly. J'aurais commencé par essayer de jouer avec ReadOnly uniquement au niveau des Columns pour que toute la colonne soit bloquée sans avoir besoin de descendre au niveau des cellules. En plus tu pourrais le faire qu'une fois du coup peu importe l'ajout ou le retrait de ligne.

    J@ck.

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Par défaut
    C'est ce que je fais non ? Je recherche les trois première colonnes, et sur chaque ligne je les mets en readOnly = true.

    Bon suite a des tests et des recherches, il se trouve que c'est dû a un bug sur la colonne d'indice 0. Apparemment, column[0] n'accepte pas de valeurs et n'aime pas qu'on lui attribue une propriété ReadOnly. A partir du moment ou on touche a ces deux informations, les propriétés des colonnes sont chamboulé et "bug". Si je commence a column[1] Je n'ai plus de problème et je peux enlever le : if (!(dataGridView1.Columns[i] is DataGridViewComboBoxColumn))

  10. #10
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Par défaut
    Ahh oui désolé je suis vraiment fatigué aujourd'hui.

    En faite c'est juste que ta boucle foreach est inutile du coup, pas besoin de boucler sur toutes les lignes, un seul datagridview1.Columns[1].ReadOnly = true; suffit pour rendre toutes les cellules de la colonne readonly.

    Ok pour le bug, mais je l'avais jamais croisé, c'est bon à savoir.

    J@ck.

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Vienne (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 62
    Par défaut
    Oui du coup on supprime la boucle ^^ Moi non plus, et surtout que personne n'a jamais eu ce problème sur internet hahaha

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

Discussions similaires

  1. ComboBox dans un DataGridView
    Par jeandadaf dans le forum VB.NET
    Réponses: 1
    Dernier message: 12/06/2009, 10h34
  2. Creer un combobox dans un datagridview bindé
    Par olibara dans le forum Windows Forms
    Réponses: 4
    Dernier message: 28/03/2009, 20h14
  3. Récuperer la valeur texte d'une combobox dans un datagridview
    Par Delphi-ne dans le forum Windows Forms
    Réponses: 0
    Dernier message: 19/03/2009, 10h17
  4. Ajouter une ComboBox dans un DataGridView
    Par mdordenart dans le forum Windows Forms
    Réponses: 5
    Dernier message: 12/03/2009, 13h59
  5. Combobox dans un datagridview
    Par nuriel2 dans le forum C#
    Réponses: 3
    Dernier message: 31/10/2007, 14h18

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