Combobox et concaténation

Résolu
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006 - 24 oct. 2005 à 18:16
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006 - 27 oct. 2005 à 09:13
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

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
25 oct. 2005 à 10:58
3
georgeduke Messages postés 167 Date d'inscription dimanche 6 février 2005 Statut Membre Dernière intervention 13 avril 2007
24 oct. 2005 à 18:43
Désolé mais je ne comprends pas bien ton souci. Peut tu le réexpliquer ?
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 oct. 2005 à 19:31
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#
*/
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
25 oct. 2005 à 06:20
c'est du web ou du winform ?

car la solution est différente...

Sébastien FERRAND
[MVP C#]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
25 oct. 2005 à 09:09
Je prends le pari sur du Winform moi

Mx
0
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006
25 oct. 2005 à 09:15
C'est du winform
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
25 oct. 2005 à 09:17
Alors utilise la solution de coq

Mx
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
25 oct. 2005 à 09:22
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#]
0
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006
25 oct. 2005 à 09:33
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
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
25 oct. 2005 à 09:36
Ah oui zut
J'aurais du attendre d'etre bien reveillé avant de poster


Mx
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
25 oct. 2005 à 09:41
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#]
0
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006
25 oct. 2005 à 09:42
je vais essayer, je te dis ca dans 5-10 minutes ^^
0
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006
25 oct. 2005 à 09:58
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
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
25 oct. 2005 à 10:14
justement avec ma solution... ta classe Personne est au centre de tout !!!

Sébastien FERRAND
[MVP C#]
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
25 oct. 2005 à 10:20
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
0
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006
25 oct. 2005 à 10:24
"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...
0
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006
25 oct. 2005 à 10:28
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...)
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
25 oct. 2005 à 10:29
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#]
0
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006
25 oct. 2005 à 10:34
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."
0
lefreeman42 Messages postés 28 Date d'inscription lundi 24 octobre 2005 Statut Membre Dernière intervention 15 juin 2006
25 oct. 2005 à 11:16
Je te remercie, il super ton prog ^^
0
Rejoignez-nous