Aller au contenu

[C#] Remplissage d'une ComboBox dans un DataGridView


Arcy

Messages recommandés

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

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

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

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

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

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

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

Je commence à être perdu :dd:

 

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

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 :craint: 

 

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é :chinois:

Lien vers le commentaire
Partager sur d’autres sites

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

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 ... :dd:

 

Merci à tous pour votre aide :)

 

:inpactitude:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...