Remplir un comboBox par une Arraylist

Signaler
Messages postés
12
Date d'inscription
mercredi 24 novembre 2010
Statut
Membre
Dernière intervention
5 mai 2011
-
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
-
Bonjour
je suis besoin d'une méthode qui remplir le comboBox par une Arrayliste j'ai crée ma propre méthode :

class ClassProcesseur
{
private string NumInvent;


public ClassProcesseur(string NumInvent)
{
NumInvent = this.NumInvent;


}
public string _NumInvent
{
get { return NumInvent; }
set { NumInvent = value; }
}


void RemplirCmbUP()
{
string str = "select NumInventaire from Processeur";
SqlCommand cmd = new SqlCommand(str, con);
SqlDataReader rd;
cmbNumUP.DataSource = null;
try
{
con.Open();
rd = cmd.ExecuteReader();

ArrayList Processeur = new ArrayList();

while (rd.Read())
{
Processeur.Add(new ClassProcesseur(rd[0].ToString()));



}
rd.Close();
cmbNumUP.DataSource = Processeur;
cmbNumUP.DisplayMember = "_NumInvent";
cmbNumUP.ValueMember = "_NumInvent";

}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
}
mais rien se passe

slvp quelqu'un peut m'aider



}

14 réponses

Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Salut,

ta ComboBox ne sait pas quel membre de l'objet afficher. Autant ça fonctionne avec un DataGridView, qui peut afficher plusieurs info pour un même objet, autant pour la ComboBox c'est pas jouable.

Un solution, remplacer :
Processeur.Add(new ClassProcesseur(rd[0].ToString()));

par :
Processeur.Add(rd[0].ToString());


Tu peux également gérer 2 ArrayLists, une pour tes obj, une pour les valeurs à lister dans ta ComboBox.

Tu pourrais également créer ta propre classe qui implémente IList pour obtenir un fonctionnement qui colle à ton besoin.
Messages postés
12
Date d'inscription
mercredi 24 novembre 2010
Statut
Membre
Dernière intervention
5 mai 2011

merciii bcp ,
Messages postés
12
Date d'inscription
mercredi 24 novembre 2010
Statut
Membre
Dernière intervention
5 mai 2011

la méthode est bien joué, mais si je peux, que lorsque je clic sur un item du combo un TextBox m'afffiche une information liée au info du ComBox
comment je peux le faire avec un code c#
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Re,

il faut implémenter l'évènement OnSelectedIndexChanged de ta ComboBox (cet évènement est lancé lorsque l'utilisateur sélectionne une item dans la ComboBox). Il faut alors utiliser le membre ComboBox.SelectedValue pour obtenir le choix de l'utilisateur. ça pourrait donner un truc comac :
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
MessageBox.Show(comboBox1.SelectedValue.ToString());
}
Messages postés
12
Date d'inscription
mercredi 24 novembre 2010
Statut
Membre
Dernière intervention
5 mai 2011

ce code me donne l'information lors de l'affichage du Message Box ,mais moi je suis besoin de l'afficher sur une TextBox je fais des éffores mais pas d'avance
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Si t'arrives pas à assigner seul un TextBox.Text va falloir revoir tes bases
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
Salut,

Ton code te permettant de remplir la ComboBox est correcte, mais l'erreur vient de ta classe ClassProcesseur... Dans le constructeur tu as inversé l'affectation de la valeur de NumInvent !!!

il ne faut pas écrire :
public ClassProcesseur(string NumInvent)
{
    NumInvent = this.NumInvent;
}


Mais plutôt :
public ClassProcesseur(string NumInvent)
{
    this.NumInvent = NumInvent;
}


Et pour récupérer l'instance de ClassProcesseur lorsque la sélection change, tu n'as plus qu'à faire :
private void cmbNumUP_SelectedIndexChanged( object sender, EventArgs e )
{
    if( cmbNumUP.SelectedItem != null )
    {
        // Récupère le processeur sélectionné par l'utilisateur
        ClassProcesseur processeurSelectionne = (ClassProcesseur)cmbNumUP.SelectedItem;

        // Affiche le NumInvent du processeur
        MessageBox.Show( processeurSelectionne._NumInvent );
    }
}


Voilà, en espérant que ça t'aide...
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
Et donc, pour l'afficher dans un TextBox...

private void cmbNumUP_SelectedIndexChanged( object sender, EventArgs e )
{
    if( cmbNumUP.SelectedItem != null )
    {
        // Récupère le processeur sélectionné par l'utilisateur
        ClassProcesseur processeurSelectionne = (ClassProcesseur)cmbNumUP.SelectedItem;

        // Affiche le NumInvent du processeur
        tonTextBox.Text = processeurSelectionne._NumInvent;
    }
}
Messages postés
12
Date d'inscription
mercredi 24 novembre 2010
Statut
Membre
Dernière intervention
5 mai 2011

vous me donnée la méthode comment récupérer et afficher l'iformation séléctionnée au Combo ms moi je veux autre chose
j'ai trouver la méthode que je veux on utilise l'événment SelectedIndexChanged du combo:
private void cmbNumUP_SelectedIndexChanged(object sender, EventArgs e)
{
//MessageBox.Show(cmbNumUP.SelectedValue.ToString());
string str = "select * from Processeur where NumInventaire='" + cmbNumUP.SelectedValue + "'";
SqlCommand cmd = new SqlCommand(str, con);
SqlDataReader dr;
try
{
con.Open();
dr = cmd.ExecuteReader();
dr.Read();
txtdesignationUP.Text = dr["Designation"].ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);

}
finally
{
con.Close();
}
}



Mercii pour votre attention
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
Oui, mais dans ce cas, la classe ClassProcesseur ne sert à rien...
Et ce n'est pas très optimisé de refaire la requête à chaque changement de sélection !

Je te propose ceci, pour ClassProcesseur :
public class ClassProcesseur
{
    public readonly string NumInvent;
    public readonly string Designation;

    public ClassProcesseur( string numInvent, string designation )
    {
        this.NumInvent = numInvent;
        this.Designation = designation;
    }
}


Et dans ton formulaire :

public void RemplirCmbUP()
{
    List<ClassProcesseur> list = new List<ClassProcesseur>();

    string str = "SELECT NumInventaire, Designation FROM Processeur";
    SqlCommand cmd = new SqlCommand( str, con );
    try
    {
        con.Open();
        SqlDataReader rd = cmd.ExecuteReader();

        while( rd.Read() )
            list.Add( new ClassProcesseur( rd[ 0 ].ToString(), rd[ 1 ].ToString() ) );

        rd.Close();
    }
    catch( Exception ex )
    {
        MessageBox.Show( ex.Message );
    }
    finally
    {
        con.Close();
    }

    cmbNumUP.DataSource = list;
    cmbNumUP.DisplayMember = "NumInvent";
    cmbNumUP.ValueMember = "NumInvent";
}

private void cmbNumUP_SelectedIndexChanged( object sender, EventArgs e )
{
    if( cmbNumUP.SelectedItem != null )
    {
        // Récupère le processeur sélectionné par l'utilisateur
        ClassProcesseur processeurSelectionne = (ClassProcesseur)cmbNumUP.SelectedItem;

        // Affiche la désignation du processeur
        txtdesignationUP.Text = processeurSelectionne.Designation;
    }
}


De cette manière tu récupères les données de la table "Processeur" une fois pour toute !

Bonne continuation ;)
Messages postés
12
Date d'inscription
mercredi 24 novembre 2010
Statut
Membre
Dernière intervention
5 mai 2011

ok fréro merciii bcp je vais le réssayé et je te repondrai après
Messages postés
12
Date d'inscription
mercredi 24 novembre 2010
Statut
Membre
Dernière intervention
5 mai 2011

salut,
j'ai réssayer votre méthode et il me génére un erreur:

Liaison au nouveau membre display impossible
Nom du paramètre :new DisplayMember
Messages postés
12
Date d'inscription
mercredi 24 novembre 2010
Statut
Membre
Dernière intervention
5 mai 2011

s'il te plait aider moi j'ai besoin de votre propositions
Messages postés
441
Date d'inscription
mardi 2 décembre 2003
Statut
Membre
Dernière intervention
22 mai 2012
7
Salut, je n'ai pas eu le temps ces derniers jours...
Je pourrais me pencher dessus cet aprèm !

Mais si tu pouvais m'envoyer ton code par mail ce serai plus facile de le debugger. (ludinski91@gmail.com)

cordialement