Jump to content

Archived

This topic is now archived and is closed to further replies.

Arcy

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

Recommended Posts

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

Share this post


Link to post
Share on other 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")

Share this post


Link to post
Share on other 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 !

Share this post


Link to post
Share on other 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;         }

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other 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).

Share this post


Link to post
Share on other sites

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 ^^ ?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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"

Share this post


Link to post
Share on other sites

WinForm, bon courage, vu que Microsoft ne le supporte plus depuis quelques temps déjà. Perso, je connais un peu WPF et surtout WinRT.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other 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) ?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other sites

×
×
  • Create New...