DatagridView, combobox et dataset

Messages postés
4
Date d'inscription
vendredi 12 avril 2019
Statut
Membre
Dernière intervention
18 avril 2019
-
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
Afficher la suite 

Votre réponse

4 réponses

Messages postés
13134
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 avril 2019
354
0
Merci
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

Jess_Predator
Messages postés
4
Date d'inscription
vendredi 12 avril 2019
Statut
Membre
Dernière intervention
18 avril 2019
-
Et oui c'est bien plus joli et pratique merci :)
Commenter la réponse de Whismeril
Messages postés
4
Date d'inscription
vendredi 12 avril 2019
Statut
Membre
Dernière intervention
18 avril 2019
0
Merci
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.

Commenter la réponse de Jess_Predator
Messages postés
13134
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 avril 2019
354
0
Merci
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és
4
Date d'inscription
vendredi 12 avril 2019
Statut
Membre
Dernière intervention
18 avril 2019
-
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.
Commenter la réponse de Whismeril
Messages postés
13134
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
21 avril 2019
354
0
Merci
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...
Commenter la réponse de Whismeril

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.