Meilleur auteur de réponses
Définir manuellement les items d'une combobox

Question
-
Bonjour,
Dans mon programme, je dois afficher une combobox avec le nom et prénom de tous les clients de la base. L'utilisateur sélectionne le client et cela affiche ses coordonnées et la possibilité de créer une commande à son nom. Pour le moment, mes id de clients sont directement dans la combobox sauf que ce n'est pas beau, ni pratique pour la recherche de client (en tapant la première lettre par exemple). Donc, ma question, c'est de savoir comment faire pour mettre les id client à la place des items de la CB, ou à un tout autre endroit pourvu qu'il soit accessible facilement et utilisable pour mes requêtes futures ?
J'ai essayer comme ceci (avec ce que j'ai vaguement compris de ce que j'ai trouvé sur les forums) :
private void FormAjoutCde_Load(object sender, EventArgs e) { MySqlDataAdapter DAAjoutCde = new MySqlAdapter("Select idClient, CONCAT(nomC, ' ',prenomC) from client order by nomC", connexion); DataSet DSNom = new DataSet(); DAAjoutCde.Fill(DSNom); CBNom.DataSource = DSNom; CBNom.DisplayMember = "CONCAT(nomC, ' ', prenomC)"; CBNom.ValueMember = "idClient"; }
Mais ça ne me met que "System.Data.DataViewManagerListItemTypeDesctiptor" dans ma combobox et je ne suis même pas sur que mes id y soit... Je suis légèrement désespérée ^^
Merci d'avance pour votre aide !
M.
Réponses
-
J'ai fait un petit projet de test avec ce code, et il fonctionne bien:
private void Form1_Load(object sender, EventArgs e) { DataSet DSNom = new DataSet(); DSNom.Tables.Add(new DataTable("Table")); DSNom.Tables[0].Columns.Add("idClient"); DSNom.Tables[0].Columns.Add("Nom"); DSNom.Tables [0].Rows.Add(new object[]{"1", "Nom 1"}); DSNom.Tables [0].Rows.Add(new object[]{"2", "Nom 2"}); DSNom.Tables[0].Rows.Add(new object[] {"3", "Nom 3" }); CBNom.DataSource=DSNom.Tables[0]; CBNom.DisplayMember = "Nom"; CBNom.ValueMember="idClient"; }
Par contre, j'ai eu le même comportement que vous avez quand j’avais
CBNom.DataSource=DSNom;
Comme les lignes
DSNom.Tables.Add(new DataTable("Table"));
DSNom.Tables[0].Columns.Add("idClient");
DSNom.Tables[0].Columns.Add("Nom");
DSNom.Tables [0].Rows.Add(new object[]{"1", "Nom 1"});
DSNom.Tables [0].Rows.Add(new object[]{"2", "Nom 2"});
DSNom.Tables[0].Rows.Add(new object[] {"3", "Nom 3" });
Sont équivalentes à votre DAAjoutCde.Fill(DSNom); je ne vois pas où est le problème.
Pouvez-vous nous montrer encore une fois votre code, je crois que vous avez manquée quelque chose?
Merci
- Marqué comme réponse Aurel Bera mardi 5 février 2013 08:37
-
C'est bon : ça marche (en mettant DAAjoutCde.Fill(DSNom) et CBNom.DataSource = DSNom.Tables[0] ! maintenant je vais voir pour tous les autres (j'en ai au moins 5 comme ça dans mon programme) ! Si j'ai un problème je reviens ! En tout cas merci beaucoup !!
M.
- Marqué comme réponse Aurel Bera mardi 5 février 2013 08:37
Toutes les réponses
-
Bonjour
N’est pas claire quel est votre problème :
Le combobox contient des System.Data.DataViewManagerListItemTypeDesctiptor en place de Nom,
ou les SevectedValues contient System.Data.DataViewManagerListItemTypeDesctiptor ?
Si c’est le premier cas, la solution c’est de modifier
MySqlDataAdapter DAAjoutCde = new MySqlAdapter("Select idClient, CONCAT(nomC, ' ',prenomC) As Nom from client order by nomC", connexion);
........................CBNom.DisplayMember = "Nom";
Cordialement,
-
Bonjour,
voici un exemple de code qui devrait fonctionner :
// Je créé ma source de données (le résultat de ta requête) DataTable dt = new DataTable("TABLE"); dt.Columns.Add("ID"); dt.Columns.Add("Nom"); dt.Columns.Add("Prenom"); dt.Rows.Add(1, "Nom1", "Prenom1"); dt.Rows.Add(2, "Nom2", "Prenom2"); DataSet ds = new DataSet("Test"); ds.Tables.Add(dt); // Je vais binder ma table a ma combo box et non le Dataset entier comboBox1.DataSource = ds.Tables["TABLE"]; comboBox1.DisplayMember = "Nom"; // La propriété qui sera afficher comboBox1.ValueMember = "ID"; // L' ID correspondant // Pour récupérer l'ID sélectionné string selectedID = ((DataRowView)comboBox1.SelectedItem).Row.ItemArray[0].ToString();
Dis nous si cela a pu t'aider :)....ou pas :(
-
Alors, tout d'abord, merci d'avoir répondu !
Ensuite,
pour fiscaMMC :
en fait je voudrais afficher le nom et le prenom du client dans ma CB donc, si je met que CBNom = "Nom" ça va pas marcher si ?
[edit : hum :/ ça ne marche pas non plus, ma combobox reste vide dans ce cas la]
pour Aurel Berra :
Je ne vois pas les index, c'est les noms dans la liste qui affiche ça donc je vais essayer votre méthode
[Edit : Après essai, ça me fais exactement la même chose]
Merci !
M.
- Modifié Milia lundi 4 février 2013 14:41 Test 2
-
-
Essayez de modifier :
CBNom.DataSource = DSNom.Tables [0];
Si vous avez des nouvelles, ajoutez une réponse.
N’est pas très facile de voire une modification d’une réponse.
Cordialement,
-
Je vous remet mon nouveau code, pour savoir si j'ai bien compris (bien que ça ne marche pas plus)
MysqlCommand req = new MySqlCommand("select idClient, Nom = CONCAT(nomC, ' ', prenomC) from client order by nomC", connexion); MySqlDataReader DRAjoutCde = req.ExecuteReader(); //J'ai remis un datareader pour pouvoir faire ma boucle ensuite DataTable dt = new DataTable("Table"); dt.columns.Add("ID"); dt.Columns.Add("Nom"); while (DRAjoutCde.Read()) { dt.Rows.Add(DRAjoutCde.GetString(0), DRAjoutCde(1)); DSNom.Tables.Add(dt); } DRAjoutCde.Close(); CBNom.DataSource = DSNom.Tables["Table"]; CBNom.DisplayMember = "Nom"; CBNom.ValueMember = "ID";
-
-
Je vois une erreur:
Vous ajoute la table dans un While(vous devez ajouter une ligne dans la table)
while..{
DSNom.Tables.Add(dt);
}
Vous compliquez les choses trop.
Je vous propose d’utiliser ce code:
private void FormAjoutCde_Load(objectsender,EventArgse)
{
MySqlDataAdapter DAAjoutCde=new MySqlAdapter("Select idClient, NOM = CONCAT(nomC, ' ',prenomC) from client order by nomC",connexion);
DataSetDSNom=newDataSet();
DAAjoutCde.Fill(DSNom);
CBNom.DataSource=DSNom.Tables[0];
CBNom.DisplayMember="NOM";
CBNom.ValueMember="idClient";
}en effet
DAAjoutCde.Fill(DSNom); c’est l’équivalent de la boucle While (corecte) ;
- Marqué comme réponse Aurel Bera lundi 4 février 2013 15:01
- Non marqué comme réponse Aurel Bera lundi 4 février 2013 15:01
- Modifié Aurel Bera lundi 4 février 2013 15:01
-
Alors, j'ai refais exactement comme vous me l'avez dit (Aurel Bera) seulement, j'ai remplacé le Nom=CONCAT(...) par CONCAT(...) as Nom car, en testant la requête dans la base ça ne marchait pas la première solution. J'en reviens donc à la toute première erreur, à savoir :
"System.Data.DataViewManagerListItemTypeDesctiptor" dans la liste la où il devrait y avoir des noms
-
Avez-vous modifiée
CBNom.DataSource=DSNom.Tables[0]; en place de
CBNom.DataSource=DSNom;?
-
-
J'ai fait un petit projet de test avec ce code, et il fonctionne bien:
private void Form1_Load(object sender, EventArgs e) { DataSet DSNom = new DataSet(); DSNom.Tables.Add(new DataTable("Table")); DSNom.Tables[0].Columns.Add("idClient"); DSNom.Tables[0].Columns.Add("Nom"); DSNom.Tables [0].Rows.Add(new object[]{"1", "Nom 1"}); DSNom.Tables [0].Rows.Add(new object[]{"2", "Nom 2"}); DSNom.Tables[0].Rows.Add(new object[] {"3", "Nom 3" }); CBNom.DataSource=DSNom.Tables[0]; CBNom.DisplayMember = "Nom"; CBNom.ValueMember="idClient"; }
Par contre, j'ai eu le même comportement que vous avez quand j’avais
CBNom.DataSource=DSNom;
Comme les lignes
DSNom.Tables.Add(new DataTable("Table"));
DSNom.Tables[0].Columns.Add("idClient");
DSNom.Tables[0].Columns.Add("Nom");
DSNom.Tables [0].Rows.Add(new object[]{"1", "Nom 1"});
DSNom.Tables [0].Rows.Add(new object[]{"2", "Nom 2"});
DSNom.Tables[0].Rows.Add(new object[] {"3", "Nom 3" });
Sont équivalentes à votre DAAjoutCde.Fill(DSNom); je ne vois pas où est le problème.
Pouvez-vous nous montrer encore une fois votre code, je crois que vous avez manquée quelque chose?
Merci
- Marqué comme réponse Aurel Bera mardi 5 février 2013 08:37
-
Bonjour tout le monde !
Alors, je vais refaire comme vous mais, ce que je ne comprends pas, c'est comment, sans boucle while ou .Fill(), je peux remplir le dataset avec les infos qu'il y a dans ma base ? Parce que la vous mettez des lignes prédéfinies...
Merci,
M.
-
Je ne sais pas si j'ai bien compris, mais j'ai fais comme ceci :
DataSet DSnom = new DataSet(); MySqlDataAdapter DAAjoutCde = new MySqlDataAdapter("Select idClient, CONCAT(nomC, ' ', prenomC) as Nom from client order by nomC, connexion); DAAjoutCde.Fill(DSNom.tables[0]); CBNom.DataSource = DSNom.Tables[0]; CBNom.DisplayMember = "Nom"; CBNom.ValueMember = "idClient";
Et là, ça remet vide...
Et j'ai pu remarquer, quand je débugue, que le programme sort de la méthode au moment de passe sir DAAjoutCde.Fill(DSNom.Tables[0]
- Modifié Milia mardi 5 février 2013 08:23 ajout
-
Bonjour Milia,
en fait, le "While" OU le "Fill" est à utiliser. Simplement, le Fill est moins verbeux en nombre de ligne de code et plus simple à utiliser car ne nécessite pas de passer par un "DataReader".
Dans les exemples que nous t'avons donnés, nous partons simplement du principe que le "DataSet" contient bien les données de la base. C'est pourquoi, nous "mockons" le remplissage du "DataSet" avec des lignes équivalentes.
Vérifie bien que ton "DataSet" contient les données provenant de la base (mais ça devrait être le cas puisque tu as du contenu dans ta "ComboBox").
Je jette à nouveau un coup d'oeil la dessus dans la journée.
-
C'est bon : ça marche (en mettant DAAjoutCde.Fill(DSNom) et CBNom.DataSource = DSNom.Tables[0] ! maintenant je vais voir pour tous les autres (j'en ai au moins 5 comme ça dans mon programme) ! Si j'ai un problème je reviens ! En tout cas merci beaucoup !!
M.
- Marqué comme réponse Aurel Bera mardi 5 février 2013 08:37
-
Bonjour
J’ai marqué les réponses.
Cordialement,