DatagridView, combobox et dataset

Jess_Predator Messages postés 4 Date d'inscription vendredi 12 avril 2019 Statut Membre Dernière intervention 18 avril 2019 - Modifié le 12 avril 2019 à 14:37
Whismeril Messages postés 18395 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 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.

private void RestorantDishesForm_Load(object sender, EventArgs e)
{
DataSet GroupInfo = BusinessLayer.GroupChainBL.SelectAllGroupchain();
comboBoxGroupChain.DataSource = GroupInfo.Tables[0];
comboBoxGroupChain.DisplayMember = "RCH_Name";
comboBoxGroupChain.ValueMember = "RCH_Id";
}


private void comboBoxGroupChain_SelectedIndexChanged(object sender, EventArgs e)
{
dataGridGroupChainMeal.DataSource=BusinessLayer.GroupChainBL.MealInfoGroupChain(Convert.ToInt32( comboBoxGroupChain.SelectedValue));
}

En gros, impossible de convertir un string, ou un objet en int.

Une idée ? sachant que cet Id j'en ai encore besoin pour autre chose, il faut absolument que j'arrive à le récupérer

4 réponses

Whismeril Messages postés 18395 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 mai 2023 623
12 avril 2019 à 18:34
Bonjour

à l'avenir, merci d'utiliser la coloration syntaxique quand tu postes un code, voir ici https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

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

0
Jess_Predator Messages postés 4 Date d'inscription vendredi 12 avril 2019 Statut Membre Dernière intervention 18 avril 2019
17 avril 2019 à 21:52
Et oui c'est bien plus joli et pratique merci :)
0
Jess_Predator Messages postés 4 Date d'inscription vendredi 12 avril 2019 Statut Membre Dernière intervention 18 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.

0
Whismeril Messages postés 18395 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 mai 2023 623
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.
0
Jess_Predator Messages postés 4 Date d'inscription vendredi 12 avril 2019 Statut Membre Dernière intervention 18 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.
0
Whismeril Messages postés 18395 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 mai 2023 623
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...
0