Jess_Predator
Messages postés4Date d'inscriptionvendredi 12 avril 2019StatutMembreDernière intervention18 avril 2019
-
Modifié le 12 avril 2019 à 14:37
Whismeril
Messages postés18395Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention27 mai 2023
-
18 avril 2019 à 18:38
Salut les amis, je galère un peu à faire ce que j'ai envie avec mon programme.
J'affiche dans un datagridview une certaine table de ma DB que j'ai remonté grâce à un dataset avec un id en paramètre. (c'est le concept).
Cet id en question, est fournit par la sélection dans une combobox.
la combobox.datasource est remplie par une table de ma DB via un dataset lui aussi.
Il remonte une colonne Nom et une colonne Id (Id qui servira comme paramètre pour mon Grid).
Afficher le nom de mes colonne dans la combobox, c'est OK
Mais afficher la bonne table dans le Grid selon la sélection du nom dans la combobox, ça foire.
comboBoxGroupChain.SelectedValue n'est ni un int, ni un string. C'est une ligne de GroupInfo.Tables[0];
Comme je n'utilise jamais de DataSet, je ne m'aventurerais pas à te faire un exemple direct.
Je te le fais donc avec une liste de "Personne" qui s'appelle "lesPersonne"
cbxPersonnes.DataSource = lesPersonnes;//binding de la liste
cbxPersonnes.DisplayMember = "Prenom";//on affiche le prénom
//PS c'est mieux en couleur non?
Plus loin
Personne p = (Personne)cbxPersonnes.SelectedValue;
//maintenant j'ai accès, aux propriété Nom, Prenom, DateNaissance, etc.. de p
Jess_Predator
Messages postés4Date d'inscriptionvendredi 12 avril 2019StatutMembreDernière intervention18 avril 2019 17 avril 2019 à 21:52
Jess_Predator
Messages postés4Date d'inscriptionvendredi 12 avril 2019StatutMembreDernière intervention18 avril 2019 17 avril 2019 à 21:51
Oké désolé pour les balises je les utiliserai à l'avenir.
Je comprend bien le concept avec la liste. Mais je m'en sors pas vraiment avec le dataSet.
Voici mon code en gros:
private void RestorantDishesForm_Load(object sender, EventArgs e)
{
//Ici, lorsque ma WindowsForm se charge, je rempli mon DataSet GroupInfo avec une table. Ensuite, je bind ma première comboBox et display la colonne "RCH_Name". ici tout va bien, ça fonctionne
DataSet GroupInfo = BusinessLayer.GroupChainBL.SelectAllGroupchain();
comboBoxGroupChain.DataSource = GroupInfo.Tables[0];
comboBoxGroupChain.DisplayMember = "RCH_Name";
}
private void comboBoxGroupChain_SelectedIndexChanged(object sender, EventArgs e)
{
DataRowView Id = (DataRowView)comboBoxGroupChain.SelectedItem;
//Ici, lorsque ma première comboBox change de sélection, le premier grid charge la table de mon DataSet en fonction de l'Id de la chaine de restaurant choisi avec la combobox.
dataGridGroupChainMeal.DataSource = BusinessLayer.GroupChainBL.MealInfoGroupChain(Convert.ToInt32(Id.Row[0])).Tables[0];
//Et ensuite, le deuxième dataSet est binder à ma deuxième comboBox, une fois encore selon l'Id selectionné de la première comboBox. Et affiche le nom des restaurant "RES_Town" qui font parti de la chaine choisie (une chaine a plusieurs restaurant)
comboBoxRestoLocation.DataSource = BusinessLayer.GroupChainBL.RestoInfoGroupeChain(Convert.ToInt32(Id.Row[0])).Tables[0];
comboBoxRestoLocation.DisplayMember = "RES_Town";
}
Jusque là, tout est fonctionnel. Mais je trouve que le code est moche et dégueulasse et j'ai vachement l'impression qu'on peut faire moins compliqué.
L'id de ma chaine sélectionnée permet de remplir le datagrid de la chaine et de remplir la comboBox de leurs restaurants.
L'id du restaurant sélectionné permet de remplir le datagrid du restaurant.
Mais le (Convert.ToInt32(Id.Row[0])).Tables[0]; c'est moche.
La où je galère le plus, c'est lorsque je veux ajouter mes sélections du premier grid dans le deuxième via un bouton ajouter.
private void btAddDish_Click(object sender, EventArgs e)
{
//Pour chaque row dans ma grid, je veux l'ajouter dans le deuxieme grid, selon l'id de mon restaurant
foreach (DataRowView oRow in dataGridGroupChainMeal.SelectedRows)
{
DataRowView Id = (DataRowView)comboBoxRestoLocation.SelectedItem;
BusinessLayer.GroupChainBL.AddDishes(oRow, Convert.ToInt32(Id.Row[0]));
}
}
Voilà deux screen pour aider à comprendre, j'ai du mal à expliquer correctement aussi.
Whismeril
Messages postés18395Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention27 mai 2023623 18 avril 2019 à 12:14
Bonjour
Comme je te l’ai dit les datatable c’est pas mon truc et winform commence à etre loin pour moi.
Je peux t’expliquer comment je ferais avec une collection d’une classe Chaine qui contient une collection d’une classe Magasin, mais cela remettra en cause ton architecture actuelle.
A toi de voir.
Jess_Predator
Messages postés4Date d'inscriptionvendredi 12 avril 2019StatutMembreDernière intervention18 avril 2019 18 avril 2019 à 14:41
Hmmmm oké :s
Explique moi toujours avec les collections, je réfléchirai si je change mon architecture. Au pire, peut-être que quelqu'un saura comment faire avec les dataSet d'ici à ce que je me décide.
Whismeril
Messages postés18395Date d'inscriptionmardi 11 mars 2003StatutContributeurDernière intervention27 mai 2023623 18 avril 2019 à 18:38
Rapidement, car je pars pour quelques jours
D'abord la classe Magasin avec en propriété tout ce qui est utile, Nom (string), l'adresse (string ou classe dédiée), le(s) numéros de téléphone, l'ID (int) l'ID de la chaine (int) etc....
Ensuite la classe Chaine, avec son ID, son Nom etc... et une collection (List ou ObservableCollection par exemple).
Tu commences par charger la table de magasins dans un dataset, que tu itères afin d'alimenter une liste temporaire de magasin. C'est là que tu fais, si besoin des conversion, une fois pour toutes.
Ensuite tu charges la table des chaines dans un autre dataset que tu itères aussi.
A chaque création de Chaine, tu fais une requêtes Linq pour charger la collection de Magasin, un truc du style
LaChaine.Magasins = (from m in lesMagasins
where m.IdChaine == LaChaine.ID
select m).ToList(); // si la collection est une liste
Après tu n'as plus besoin de la liste temporaire.
Tu pourrais aussi faire une jointure (Linq sais faire).
Pour le binding, tu peux binder directement la collection de chaine à un Datagridview ou passer par un bindingSource pour plus de personnalisation, exemple ici Si tu veux afficher la liste des magasin d'une chaine dans une autre contrôle, tu castes l'item sélectionnée comme je t'ai montré plus haut et tu as directement accès à sa liste de magasin.
Si tu veux afficher les détails d'un magasin, tu castes l'item sélectionné et tu as directement un magasin etc...
17 avril 2019 à 21:52