Arcy Posté(e) le 18 janvier 2016 Partager Posté(e) le 18 janvier 2016 Bonjour, Je travaille sur un DataGridView dont une colonne de chaque ligne contiendra une ComboBox (ColumnType : DataGridViewComboBoxColumn). Les informations de la ComboBox proviennent d'une liste relative à chaque entrée/ligne de la DGV. Le problème étant que je tombe sur une erreur à chaque fois que j'essaie quelque chose (et qui semble pourtant cohérent), lorsque le formulaire se dessine. L'exception suivante s'est produite dans le DataGridView :System.ArgumentException : La Valeur DataGridViewComboBoxCell n'est pas valide Puisqu'il y a une combobox à chaque ligne, j'ai autant de fois cette erreur que d'entrées. Voilà mon code : public void MaJ_DGV(){ // 3 colonnes : [Nom] [Prénom] [Etat] // [Etat] affiche plusieurs informations propres à chaque ligne dgv_liste.Rows.Clear(); // création de la ComboBox DataGridViewComboBoxCell CBox = new DataGridViewComboBoxCell(); // monEntree.maListe est une List<MaClass> foreach (MaClass e in monEntree.maListe) { CBox.Items.Add(e.ToString()); } dgv_liste.Rows.Add( monEntree.Nom; monEntree.Prenom; CBox; );} J'arrive vraiment pas à comprendre le pourquoi du comment ... Si vous avez des pistes, je suis preneur ! Merci à vous : ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Aloyse57 Posté(e) le 18 janvier 2016 Partager Posté(e) le 18 janvier 2016 Salut, Je ne connais pas C#, mais dans les autres langages, tu dois charger la combo une seule fois à l'initialisation (toutes les lignes ont la même combo). Ensuite au chargement des lignes, l'indice Cbox va automatiquement choisir la valeur correspondante. Exemple : a)à l'initialisation de la table : CBox.Items.Add("M") CBox.Items.Add("F") b)au remplissage de la table dgv_liste.Rows.Add( monEntree.Nom; monEntree.Prenom; CBox; ); où CBOX=1 ou 2 (1->"H", 2->"F") Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 19 janvier 2016 Auteur Partager Posté(e) le 19 janvier 2016 Bon, j'ai tenté une autre approche. Plutôt que de vouloir créer une combobox pour pouvoir remplacer l'ancienne, j'ai choisi d'envoyer une valeur vide et de la remplacer par le contenu qui m'intéresse : public void MaJ_DGV(){ // 3 colonnes : [Nom] [Prénom] [Etat] // [Etat] affiche plusieurs informations propres à chaque ligne dgv_liste.Rows.Clear(); dgv_liste.Rows.Add( monEntree.Nom; monEntree.Prenom; ""; ); int fin = dgv_liste.Rows.Count - 1; // monEntree.maListe est une List<MaClass> foreach (MaClass e in monEntree.maListe) { ((DataGridViewComboBoxCell) dgv_liste.Rows[fin].Cells["Etat"]).Items.Add(e.ToString()); } // dgv_liste.Rows[fin].Cells["Etat"].Items[0] => "BlaBla" // dgv_liste.Rows[fin].Cells["Etat"].Items[1] => "BloBlo"} J'ai donc casté dgv_liste.Rows[fin].Cells["Etat"] pour avoir les méthodes d'ajouts de la ComboBox. Si au final, j'ai bien pu ajouter mes informations, les données ne s'affichent toujours pas dans la ComboBox ... -_-" Pourtant, c'est exactement ce moyen ( uneComboBox).Items.Add(e.ToString()) ) que j'utilise pour mes autres contrôles similaires ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Aloyse57 Posté(e) le 19 janvier 2016 Partager Posté(e) le 19 janvier 2016 Salut, Je viens de vérifier avec mon ami Google "How to select a value from a combobox in c#" Une combo se remplit par Add, mais la valeur affichée provient de SelectedIndex Lu ici private void bindCombo() { string q = "select policestation from addpolicestation"; SqlDataAdapter da = new SqlDataAdapter(q, "da.crim()"); DataTable dt = new DataTable(); da.Fill(dt); comboB1.Items.Add("--Select--"); foreach (DataRow row in dt.Rows) { comboB1.Items.Add(row["policestation"]); } comboB1.SelectedIndex = 0; } Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 19 janvier 2016 Auteur Partager Posté(e) le 19 janvier 2016 J'ai déjà cette méthode pour une autre combobox, aucun problème. Le truc, c'est que la CBox de la DGV reste vide ... C'est bien la première fois que je bute sur un truc aussi simple. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 21 janvier 2016 Auteur Partager Posté(e) le 21 janvier 2016 Bon, j'ai tenté une autre approche (encore ...) pour voir s'il y avait pas une erreur sur ma méthode pour insérer les données. J'ai donc crée 2 lignes et j'ai mis du contenu par défaut (possible via l'éditeur de formulaire, on a juste à cliquer sur la colonne qui nous intéresse et on indique la collection). Mais le contenu par défaut n'apparait pas dans les combobox alors que le contenu est bien inséré (au même endroit que les infos qui m'intéresse, donc pas d'erreur). Lien vers le commentaire Partager sur d’autres sites More sharing options...
Alastor Posté(e) le 21 janvier 2016 Partager Posté(e) le 21 janvier 2016 Tu veux dire que ta cellule contient bien l'information mais qu'elle n'est pas affichée ? Si c'est le cas il n'y a pas bêtement l'attribut Visible à false sur ta cellule ^^ ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Edtech Posté(e) le 21 janvier 2016 Partager Posté(e) le 21 janvier 2016 Euh, je vais jeter un pavé dans la marre, mais un ComboBox étant un objet graphique, il ne DOIT PAS être rempli manuellement, mais uniquement par Binding. Donc, tu dois simplement lier ton ComboxBox à ta liste d'objets de ta classe métier, il va se remplir tout seul. DataGrid ? Tu es en WPF ? Si en WinRT (XAML), utilise une Grid de base avec un template d'item qui charge un ComboBox par élément de ta grille. Dans tous les cas, tu ne dois jamais toucher à un objet graphique dans le code, juste du binding dans le XAML. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 21 janvier 2016 Auteur Partager Posté(e) le 21 janvier 2016 En fait, je vois la combobox mais aucune information n'est visible et quand je clique dessus, rien ne se produit. EDIT : je suis en Windows Forms et l'objet que je cherche à mettre est une collection d'objet propre à l'entrée/ligne. EDIT 2 : @EdTech : Tu faisais peut être référence à ça : ((DataGridViewComboBoxCell) dgv_liste.Rows[dgv_liste.Rows.Count - 1].Cells["Etat"]).DataSource = monEntree.maliste; Mais ça a le même effet (le contenu est bien dans "Items" mais la combobox réagit comme si elle était vide). // dgv_liste.Rows[0].Cells["Etat"].Items[0] => "BlaBla" // dgv_liste.Rows[0].Cells["Etat"].Items[1] => "BloBlo" Lien vers le commentaire Partager sur d’autres sites More sharing options...
Edtech Posté(e) le 21 janvier 2016 Partager Posté(e) le 21 janvier 2016 WinForm, bon courage, vu que Microsoft ne le supporte plus depuis quelques temps déjà. Perso, je connais un peu WPF et surtout WinRT. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 21 janvier 2016 Partager Posté(e) le 21 janvier 2016 Sur ta combobox tu définis bien ton DisplayMember? De souvenir, les ComboBox doivent avoir un displayMember qui défini la propriété a afficher dans la liste. Il faudrait que je teste sous VS chez moi Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 21 janvier 2016 Auteur Partager Posté(e) le 21 janvier 2016 Je commence à être perdu Bon alors, sans parler de collection ou quoi que ce soit. Dans les propriétés (DataGridView) de ma colonne Etat, j'ai choisi comme type de colonne "DataGridViewComboBoxColumn" (donc, une combobox) et j'ai rajouté comme items "1" et "2" (une saisie par ligne - catégorie Données - ligne Items). J'ai crée 1 ligne (dgv_liste.Rows.Add(1)) et je vois bien les valeurs insérées par l'IDE : dgv_liste.Rows[0].Cells["Etat"].Items [0] = "1" [1] = "2" Maintenant, pourquoi ma combobox est vide et quand je clique dessus, il n'y a aucune réaction (comme s'il n'y avait aucun contenu à afficher) ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 21 janvier 2016 Partager Posté(e) le 21 janvier 2016 @Arcy : je ne pourrais pas tester ça avant Lundi (WE Séminaire toussa). Donc, si tu veux Lundi, si j'y pense, je tenterais de faire le truc Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 21 janvier 2016 Auteur Partager Posté(e) le 21 janvier 2016 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Nemasix Posté(e) le 22 janvier 2016 Partager Posté(e) le 22 janvier 2016 Salut Arcy, je viens de faire le test suivant : - Création d'un projet Windows Forms - Ajout d'un DataGridView dans ma form - Ajout d'une DataGridViewComboBoxColumn dans ma DataGridView - Modification de cette colonne pour ajouter 1, 2 et 3 comme valeurs "fixe", directement via le design. Je lance l'appli et je vois bien 1, 2 et 3 dans ma combo. Tu dois avoir un truc qui chie dans la colle sur ton code qui génère des données dans ta combobox Je n'ai rien changer à mon code. 2ème test : J'ajoute à mon constructeur de mon Form1 ce code : ObservableCollection<String> lTest = new ObservableCollection<string>(); lTest.Add("1"); lTest.Add("2"); lTest.Add("3"); lTest.Add("4"); // Test est le nom de ma DataGridViewComboBoxColumn Test.DataSource = lTest;Avec ce code en plus, je vois bien 1,2,3 et 4 dans ma combobox.Je sais pas si ça te sera utile, mais voilà ce que j'ai testé Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 22 janvier 2016 Auteur Partager Posté(e) le 22 janvier 2016 Bon, je vais faire un deuxième projet et les lancer en même temps, je reviens ici dés que j'ai la réponse. Lien vers le commentaire Partager sur d’autres sites More sharing options...
ExIcarus Posté(e) le 22 janvier 2016 Partager Posté(e) le 22 janvier 2016 Hello, Est-ce que tu as vérifié les données de ta liste? (Par de doublon par exemple) Sur la page du MSDN : https://msdn.microsoft.com/fr-fr/library/system.windows.forms.datagridviewcomboboxcell.items%28v=vs.110%29.aspx Il est stipulé : DataGridViewComboBoxCell ne prend pas en charge l'utilisation de plusieurs éléments avec des valeurs d'affichage identiques. C'est peut-être une piste à vérifier Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 22 janvier 2016 Auteur Partager Posté(e) le 22 janvier 2016 En théorie, ça peut pas être en doublon (mais ton info est bonne à savoir, je vais intégrer un contrôle supplémentaire). Même avec "1" et "2" comme données, la combobox reste vide. Du coup, je vérifie les propriétés. EDIT : le problème venait bien d'une propriété. Ne voulant permettre que l'affichage, j'ai mis ReadOnly à TRUE. Ce qui explique pourquoi la combobox ne réagit pas quand on clique dessus ... Merci à tous pour votre aide :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.