Combobox et concaténation [Résolu]

Signaler
Messages postés
28
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
15 juin 2006
-
Messages postés
28
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
15 juin 2006
-
Bonjour,



Voila, je suis étudiant et j'ai commencé à programmer en c# depuis début septembre.



J'ai un problème avec une combobox.

Notre prof veut que nous fassions une recherche sur le nom de personnes
que nous avons créé à l'aide d'un formulaire avec une collection
(jusque la pas de soucis), mais si nous mettons deux fois le même nom
alors il y a un plantage.Donc j'ai créé un numéro de personne, le seul
hic c'est que faire une recherche sur un numéro de personne ben c'est
pas terrible lol

Donc j'ai voulu concaténé le nom de la personne et son numéro dans une
combobox que je charge dans le form_load, mais le problème, c'est que
je ne sais pas comment récupérer le numéro une fois concaténé : (

Si quelqu'un pouvait me dire un moyen de récupérer juste le numéro ou une solution plus simple, ca m'aiderait beaucoup



Merci d'avance ^^

25 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

Désolé mais je ne comprends pas bien ton souci. Peut tu le réexpliquer ?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
Salut,

Met ton numéro en temps que Value quand tu définis les items et sert toi de SelectedValue pour récupérer le numéro de personne pour l'item sélectionné.

/*
coq
MVP Visual C#
*/
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
c'est du web ou du winform ?

car la solution est différente...

Sébastien FERRAND
[MVP C#]
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Je prends le pari sur du Winform moi

Mx
Messages postés
28
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
15 juin 2006

C'est du winform
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Alors utilise la solution de coq

Mx
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
nan... coq, c'est du webform

ce que tu peux faire pour résoudre ton problème c'est plutot que de donner une chaine de caractère à ton combobox, c'est lui donner des objets.

ex :

struct Personne {
public string Nom;
public string Prenom;
public int Id;
...

public override string ToString() {
return this.Nom + " " + this.Prenom;
}
}

et donc tu fais ceci :

Personne pers = new Personne();
pers.Nom = "Truc";
pers.Prenom = "Bidule";
pers.Id = 500;
tonCombo.Items.Add(pers);
... etc...

et tu récupères comme ceci :

((Personne)tonCombo.SelectedItem).Id --> 500

Sébastien FERRAND
[MVP C#]
Messages postés
28
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
15 juin 2006

Cette partie correspond au chargement de la combobox:



private void Fvisuclient_Load(object sender, System.EventArgs e)

{

int
j=mesPersonnes.cardinal(); //On compte le nombre d'objets dans la
collection mesPersonnes

unePersonne = new Personne();



for (int i=0; i<j ; i++)

{



unePersonne=(Personne)mesPersonnes.extraireObjet(i);//On extrait tous
les objets de la collection

string nom=unePersonne.getNom();


string
num=Convert.ToString(unePersonne.getNumeroPersonne());


cb_nom.Items.Add(nom+" "+num); //Puis on les ajoute
dans la combobox

}

}



La c'est la combobox :



private void cb_nom_SelectedIndexChanged(object sender, System.EventArgs e)

{

int num=Convert.ToInt32(cb_nom.Text);

unePersonne=new Personne();

int
j=mesPersonnes.cardinal(); //On compte le nombre d'objets dans la
collection mesPersonnes

unePersonne = new Personne();



for (int i=0; i<j ; i++)

{



unePersonne=(Personne)mesPersonnes.extraireObjet(i);//On extrait tous
les objets de la collection




//On fait une recherche sur le numéro car unique
pour chaque client

if (num==unePersonne.getNumeroPersonne())

{

lb_nom.Text=unePersonne.getNom();



lb_prenom.Text=unePersonne.getPrenom();



lb_date.Text=Convert.ToString(unePersonne.getDateNaissance());

}

}

}



Je réexplique mon problème, si dans ma collection mesPersonnes il y a
deux noms identiques ===> plantage du prog, je n'affiche pas ce que
je veux...

Donc solution, faire une recherche sur un numéro qui est unique pour
chaque personne, mais faire une recherche sur un numéro ce n'est pas
terrible. Pour plus de clarté, je veux afficher le nom ET le numéro de
la personne, mais je ne sais pas comment je dois faire pour déconcaténé
les données que j'ai chargé dans ma combobox.

Est-ce que c'est plus clair la ???J'arrive pas mieux à expliquer,
désolé...L'année dernière on programmait en php4 (en 1ere année de BTS
IG), et cette année on passe direct aux objets avec le C#, pas facile
la transition :x

Si c'est pas possible, faites le moi savoir ca m'éviterait que je me complique la vie pour rien lol
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Ah oui zut
J'aurais du attendre d'etre bien reveillé avant de poster


Mx
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
hum... as-tu lu la réponse que j'ai mis avant toi ???
dans ton combobox ne met pas de libelle mais uniquement des objets !

il te suffit de faire un override de la méthode ToString() pour afficher la concaténation de ce que tu veux. Et pour récupérer la valeur, tu fais un cast... y a pas plus simple !

re-exemple :
private void Fvisuclient_Load(object sender, System.EventArgs e)
{
int j=mesPersonnes.cardinal(); //On compte le nombre d'objets dans la collection mesPersonnes

for (int i=0; i<j ; i++)
{
unePersonne=(Personne)mesPersonnes.extraireObjet(i);//On extrait tous les objets de la collection
cb_nom.Items.Add(unePersonne); //Puis on les ajoute dans la combobox
}
}

et pour récupérer :
private void cb_nom_SelectedIndexChanged(object sender, System.EventArgs e)
{
if (cn_nom.SelectedIndex != -1)
unePersonne = (Personne)cb_nom.SelectedItem;
}

si c'est trop compliqué... je comprends pas :(

Sébastien FERRAND
[MVP C#]
Messages postés
28
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
15 juin 2006

je vais essayer, je te dis ca dans 5-10 minutes ^^
Messages postés
28
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
15 juin 2006

Je viens de me rendre compte que j'ai oublié de préciser que Personne est une classe...

Apparemment avec ta méthode je ne l'utilise plus...

Désolé, mais merci quand même pour la solution ^^



si ca peut voici le bordel :



//Description des données

private int numeropersonne;

private string nom;

private string prenom;

private DateTime datenaissance;

//Fin de description des données



//Description des méthodes



//Accesseurs set

//Insertion du nom

public void setNom (string n)

{

nom=n;

}



//Insertion du prenom

public void setPrenom (string p)

{

prenom=p;

}



//Insertion de la date

public void setDateNaissance (DateTime datenaiss)

{

datenaissance=datenaiss;

}

//Fin des accesseurs set



//Accesseurs get

//Renvoi le numéro du client

public int getNumeroPersonne()

{

return numeropersonne;

}



//Renvoi le nom

public string getNom()

{

return nom;

}



//Renvoi le prénom

public string getPrenom()

{

return prenom;

}



//Renvoi la date de naissance

public DateTime getDateNaissance()

{

return datenaissance;

}

//Fin des accesseurs get

//Fin des accesseurs



//Initialisation du client:on entre les différentes valeurs des champs qui ont été saisis

public void initPersonne (string n, string p, DateTime d)

{


numeropersonne=tirageNumeroPersonne(); //on crée un numero pour le
nouveau client

nom=n;

prenom=p;

datenaissance=d;

}



//Création d'un numéro de client

public int tirageNumeroPersonne()

{

Random rnd=new Random();

int num=rnd.Next();

return num;

}

//Fin de description des méthodes
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
justement avec ma solution... ta classe Personne est au centre de tout !!!

Sébastien FERRAND
[MVP C#]
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
54
Ma solution , qui rejoint celle de seb



Deja, transforme ta classe Personne ainsi :



class Personne

{

private string nom;

private string prenom;

private DateTime datenaissance;



// Propriétés



public string Nom

{

get { return this.nom; }

set { nom = value; }

}



public string Prenom

{

get { return prenom; }

set { prenom = value; }

}



public DateTime Datenaissance

{

get { return datenaissance; }

set { datenaissance = value; }

}





//Constructeur de la classe

public Personne(string n, string p, DateTime d)

{

nom = n;

prenom = p;

datenaissance = d;

}

}



Ensuite, dans ta form, rajoute un ArrayList (que j'ai appelé List dans mon exemple)

Ajoute toute les instances de Personne dans cette ArrayList



this.list.Add(new Personne("aaa", "aaa", DateTime.Now));

this.list.Add(new Personne("bbb", "bbb", DateTime.Now));

this.list.Add(new Personne("aaa", "aaa", DateTime.Now));



Ajoute aussi ces 2 lignes (dans ton constructeur par exemple), qui
binderont ton Combobox a ton ArrayList. Il n'y aura plus besoins de ta
boucle for qui charge ton combobox



<hr size ="2" width="100%"> this.comboBox1.DataSource = list;

this.comboBox1.DisplayMember = "Nom";



Et pour recuperer la personne choisie dans le combobox :



private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)

{

Personne temp = (Personne)this.comboBox1.SelectedItem;

MessageBox.Show(temp.Nom +" " + temp.Prenom);



}


Mx
Messages postés
28
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
15 juin 2006

"struct Personne {

public string Nom;

public string Prenom;

public int Id;

...



public override string ToString() {

return this.Nom + " " + this.Prenom;

}

}

et donc tu fais ceci :



Personne pers = new Personne();

pers.Nom = "Truc";

pers.Prenom = "Bidule";

pers.Id = 500;

tonCombo.Items.Add(pers);

... etc...



et tu récupères comme ceci :



((Personne)tonCombo.SelectedItem).Id"



C'est ca que je comprend pas...Je met quoi a la place de bidule and co
, parce que je ne peux plus utiliser les méthodes de ma classe...

"il te suffit de faire un override de la méthode ToString() pour
afficher la concaténation de ce que tu veux. Et pour récupérer la
valeur, tu fais un cast... y a pas plus simple !"

Je sais pas ce que c'est qu'un cast et un override...Plus débutant que moi tu meurs...
Messages postés
28
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
15 juin 2006

Ta solution parait nikel...mais je fais comment car je sais pas a
l'avance combien de personnes il y a...on les inscrit une par une a
l'aide d'une autre fenetre...C'est un truc de fou ce nous demande le
prof lol (pour mon niveau en tout cas...)
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
36
mouaip... biensur ce que tu n'as pas vu, c'est que j'ai reposté une solution adapté à la classe que tu as cité.

Sébastien FERRAND
[MVP C#]
Messages postés
28
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
15 juin 2006

En mettant ce que tu m'as dit a savoir ca (je ne change rien d'autre):



private void Fvisuclient_Load(object sender, System.EventArgs e)

{

int
j=mesPersonnes.cardinal(); //On compte le nombre d'objets dans la
collection mesPersonnes



for (int i=0; i<j ; i++)

{



unePersonne=(Personne)mesPersonnes.extraireObjet(i);//On extrait tous
les objets de la collection


cb_nom.Items.Add(unePersonne); //Puis on les ajoute dans la combobox

}

}



private void cb_nom_SelectedIndexChanged(object sender, System.EventArgs e)

{

if (cb_nom.SelectedIndex != -1)

unePersonne
= (Personne)cb_nom.SelectedItem;

}

j'ai cette erreur

"Une exception non gérée du type 'System.FormatException' s'est produite dans mscorlib.dll



Informations supplémentaires : Le format de la chaîne d'entrée est incorrect."
Messages postés
28
Date d'inscription
lundi 24 octobre 2005
Statut
Membre
Dernière intervention
15 juin 2006

Je te remercie, il super ton prog ^^