Sélection d'éléments venant d'une base de données, via comboBox

Résolu
S1rK Messages postés 17 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 15 novembre 2011 - 9 mars 2010 à 10:55
imothepe_33 Messages postés 168 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 28 novembre 2012 - 9 mars 2010 à 19:11
Bonjour à tous,

Voila je travail actuellement sur un PDA Industriel et une base de données très simple, comportant une table "Produit" et une table "Stock" avec l'utilisation d'ID pour les deux.

Mon objectif est le suivant: Je souhaite afficher ma table "Produit" dans une comboBox(jusque là, tout va bien), et a partir de celle-ci, lorsque je sélectionne l'un des produits, je souhaite que le stock correspondant s'affiche (dans une textBox par exemple) pour le produit en question.

private void button1_Click(object sender, EventArgs e)
        {
            SqlCeConnection myConnection;
            myConnection = new SqlCeConnection("Data Source=blablabla");
            myConnection.Open();

            /* Efface le contenu de notre comboBox */
            comboBox1.Items.Clear();

            try
            {
                SqlCeCommand myCommand = new SqlCeCommand("SELECT Nom FROM Produit", myConnection);
                SqlCeDataReader Reader = myCommand.ExecuteReader();

                while (Reader.Read())
                {
                    comboBox1.Items.Add(Reader[1].ToString());
                }

                Reader.Close();

                MessageBox.Show("Listing fini", "OK");
            }

            catch (SqlCeException exp)
            {
                MessageBox.Show(exp.Message);
            }

            finally
            {
                myConnection.Close();
            }
        }


Pour l'affichage de ma table "Produit" dans ma comboBox, pas de soucie, là où je bloque, et voila ma question: Comment sélectionner un produit(venant de ma table "Produit") de ma comboBox, et lui indiquer via une textBox le nombre de Stock pour celui-ci(provenant de la seconde table "stock"). Ce n'est peut être pas la bonne méthode ici, peut-être est-il préférable d'utiliser les ID dans la comboBox au lieu des Produits? Si vous avez des idées, je suis preneur =)

Voila j'espère avoir été clair ^^ d'avance merci pour votre aide =)

2 réponses

imothepe_33 Messages postés 168 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 28 novembre 2012 7
9 mars 2010 à 19:06
Si je comprends bien, tu as une relation Maître/Esclave entre tes tables Produit et Stock. Donc la table Produit envoie sa clé primaire dans la table Stock, cela veut dire que tu devras faire une requête SELECT sur la table Stock en précisant l'ID du produit dont tu veux récupérer la quantité en stock.
Tout d'abord, tu dois au niveau de ton combobox être en mesure de récupérer l'id de ton produit mais ton code ne te permet pas de le faire. Pour initialiser ton combobox, il te faut à la fois afficher le NOM du produit et récupérer l'ID du produit. Pour ce faire, ta requête dois renvoyer l'Id et le Nom du produit. Comment le récupérer? Tu as deux options soit tu utlises un DataTable ou un BusinessObject, qui tous les sont une représention des champs de ta table produit. Pour ma part, je préfère les BusinessObject. Les modifications que tu dois apporter à ton code sont les suivantes:

1/ Créer un BusinessObject pour la table Produit(Ceci n'est qu'un exemple)

public class ProduitBO
{
   private int id;
   
   public int Id
   {
      get { return id;}
      set { id = value;}
   }

   private string nomProduit;

   public string NomProduit
   {
      get { return nomProduit;}
      set { nomProduit = value;}
   }

   public ProduitBO()
   {}   
}


2/ Modifications de ton code

private void button1_Click(object sender, EventArgs e)
{
SqlCeConnection myConnection;
myConnection = new SqlCeConnection("Data Source=blablabla");
myConnection.Open();

/* Efface le contenu de notre comboBox */
comboBox1.Items.Clear();

//Tu créés une liste générique
List liste = new List();

try
{
SqlCeCommand myCommand = new SqlCeCommand("SELECT * FROM Produit", myConnection);
SqlCeDataReader Reader = myCommand.ExecuteReader();

while (Reader.Read())
{
ProduitBO p = new ProduitBO();

p.Id = (int)Reader["NomDuChampIDProduit"];
p.NomProduit = Reader["NomDuChampNomProduit"].ToString();

//Ici tu rempli ta liste des objets que tu récupères
liste.Add(p);
}

Reader.Close();

//Ici tu remplis ton combobox
//tu indiques la valeur à récupérer (Nom de la propriété dans le BusinessObject)
comboBox1.ValueMember = "Id";

// tu indiques la valeur à afficher (Nom de la propriété dans le BusinessObject)
comboBox1.displayMember = "NomProduit";

comboBox1.DataSource = liste;

MessageBox.Show("Listing fini", "OK");
}

catch (SqlCeException exp)
{
MessageBox.Show(exp.Message);
}

finally
{
myConnection.Close();
}
}

3/ Comment récupérer l'Id de ton produit?

A toi de voir l'évènement du combobox qui te convient pour récupérer l'id; tu écris

//Tu récupères l'id du produit dans la variable id 
int id = comboBox1.SelectedValue


Une fois ceci fais, tu passes en paramètre la variable id à ta requête SELECT sur la table stock.

Merci pour ta compréhension.

Only the strong survive !
3
imothepe_33 Messages postés 168 Date d'inscription mardi 27 juillet 2004 Statut Membre Dernière intervention 28 novembre 2012 7
9 mars 2010 à 19:11
Ton code en question...

private void button1_Click(object sender, EventArgs e)
{
   SqlCeConnection myConnection;
   myConnection = new SqlCeConnection("Data Source=blablabla");
   myConnection.Open();

   /* Efface le contenu de notre comboBox */
   comboBox1.Items.Clear();

   //Tu créés une liste générique
   List liste = new List();

   try
   {
     SqlCeCommand myCommand = new SqlCeCommand("SELECT * FROM Produit", myConnection);
     SqlCeDataReader Reader = myCommand.ExecuteReader();

     while (Reader.Read())
     {
       ProduitBO p = new ProduitBO();

       p.Id = (int)Reader["NomDuChampIDProduit"];
       p.NomProduit = Reader["NomDuChampNomProduit"].ToString();

       //Ici tu rempli ta liste des objets que tu récupères
       liste.Add(p);
     }

     Reader.Close();

    //Ici tu remplis ton combobox
    //tu indiques la valeur à récupérer (Nom de la propriété dans le BusinessObject)
    comboBox1.ValueMember = "Id";

    // tu indiques la valeur à afficher (Nom de la propriété dans le BusinessObject)
    comboBox1.displayMember = "NomProduit";

    comboBox1.DataSource = liste;

    MessageBox.Show("Listing fini", "OK");
   }
   catch (SqlCeException exp)
   {
     MessageBox.Show(exp.Message);
   }

   finally
   {
     myConnection.Close();
   }
} 


Only the strong survive !
1
Rejoignez-nous