Récupérer un struc à partir d'un de ses élément

Résolu
Messages postés
8
Date d'inscription
lundi 11 septembre 2006
Statut
Membre
Dernière intervention
19 septembre 2006
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
-
C'est peut-être complètement tordu, mais j'aimerais faire ceci:

J'ai un struct appelée "camion" qui contient trois string : marque, vitesse, chauffeur

J'aia créé 3 variables camions  : Cam1, Cam2 et Cam3

J'ai une listBox avec 3 éléments : il s'agit des :

Cam1.chauffeur, Cam2.chauffeur et Cam3.chauffeur, j'ai donc une liste avec le nom des trois chauffeurs


Lorsque je clic sur un élément de la liste, je le récupère avec :

listBox.selectedItem.ToString()

j'aimerais récupérer la variable "camion" auquel elle appartient pour
pouvoir ensuite afficher la marque et la vitesse dans un label. Et je
n'ai aucune idée de la façon de le faire.


une autre méthode serait d'associer un objet à chaque élément d'une listBox, mais je suis pas sur que ce soit possible.


Donc si quelqu'un a une solution pratique, facile et efficace , ça serait super.

Si vous avez une solution peu pratique, pas facile mais quand même efficace, ça ira aussi :)

14 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
Salut,

C'est tres facile a faire.
Ajoutes toutes les instances de Camion dans une List<Camion> (ou ArrayList si tu bosses en .Net 1).
Affecte cette List a la propriété DataSource de ton ListBox;
Affecte la ta propriété "Chauffeur" de ta classe Camion a la propriété DisplayMember de ton ListBox.

Tu peux maintenant recuperer l'instance du camion selectionné via la propriété SelectedItem de ton ListBox :)

Mx
MVP C# 
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Salut,
C'est évident qu'il faut associer ton object à ta liste, pas juste un string :

this.listBox1.Items.Add(monCamion);
// Ajout du camion
Camion camion =
this.listBox.SelectedItem
as
Camion;
// Récupération du camionIl ne serait pas inutile de vérifier que camion n'est pas null...
Et sachant que la ListBox affiche le string renvoyer par ToString(), il suffit d'overrider cette dernière dans la classe camion pour personnaliser l'affichage...

<hr size="2" />VC# forever
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Eu par le refresh (pour changer...)

<hr size="2" />VC# forever
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
Ca te fera que la 2eme fois aujourd'hui ;)

Mx
MVP C# 
Messages postés
8
Date d'inscription
lundi 11 septembre 2006
Statut
Membre
Dernière intervention
19 septembre 2006

Bien, merci pour ces réponses, mais ça n'est pas encore tout à fait fini, désolé.


voici ce que j'ai fais:

private void achatVeh_Load(object sender, EventArgs e)

        {

            List<camion> mylist = new List<camion>();

            mylist.Add(Cam1);

            mylist.Add(Cam2);

            mylist.Add(Cam3);

            listVehicules.DataSource = mylist;

            listVehicules.DisplayMember = chauffeur;

        }

c'est sur cette dernière ligne que ça bloque, ça marche pas vu que ce
qui est affiché dans la listebox est "windowsApplication2.camio,". Un
peu ennuyeux, si vous pouviez m'expliquer ce qu'il faut mettre en
displaymember sachant que ma struct est ainsi:

public struct camion

{

public string marque

public string vitesse

public string chauffeur

}


Merci
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
il te faut une propriété Chauffeur dans ta structure.

public string Chauffeur
{
   get { return this.chauffeur; }
  //set { this.chauffeur = value;}
}

et assignes "Chauffeur" au DisplayMember
... et par la meme occasion, passer ton champ chauffeur en private

Mx
MVP C# 
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Faut faire une Property avec un get pour que ça marche...

<hr size="2" />VC# forever
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Non mais c'est pas vrai ! Mx, t'arrêtes !

<hr size="2" />VC# forever
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
Désolé
La prochaine, s'il y a, je te la laisse

Mx
MVP C# 
Messages postés
8
Date d'inscription
lundi 11 septembre 2006
Statut
Membre
Dernière intervention
19 septembre 2006

Ahr, c'est rageant ça marchait presque:

Si je fais exactement comme tu me dit mx, j'ai une erreur lors de
l'affectation de la variable cam1.chauffeur (et aussi cam2.chauffeur
etc...):   La propriété ou l'indexeur
'WindowsApplication2.form1.camion.chauffeur' ne peut pas être assigné
-- il est en lecture seule   


Si je met aussi le set, il me génère un stack overflow (boucle
infinie?). Enfin, si j'enlève les affectations de variables, j'ai aussi
un stackoverflow.


Bref, plus ça avance, plus ça me parait compliqué.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Exemple :

public
partial
class
Form1 :
Form
{
  
public Form1()
   {
      InitializeComponent();
   }

  
private
void Form1_Load(
object sender,
EventArgs e)
   {
     
List<
Camion> camions =
new
List<
Camion>();
      camions.Add(
new
Camion(1,
"Un"));
      camions.Add(
new
Camion(2,
"Deux"));
      camions.Add(
new
Camion(3,
"Trois"));
      camions.Add(
new
Camion(4,
"Quatre"));
     
this.listBox1.DataSource = camions;
     
this.listBox1.DisplayMember =
"Name";
   }
}

public
struct
Camion
{
  
private
int _age;
  
private
string _name;

   public Camion(
int age,
string name)
   {
     
this._age = age;
     
this._name = name;
   }

  
public
string Name
   {
     
get {
return
this._name; }
     
set {
this._name =
value; }
   }
}

<hr size="2" />VC# forever
Messages postés
8
Date d'inscription
lundi 11 septembre 2006
Statut
Membre
Dernière intervention
19 septembre 2006

En fait c'est bon, c'est juste que je suis pas assez rigoureux, j'ai attribué le même nom à la variable et au conteneur de GET{}


Merci à vous deux pour vos réponse, je retourne dans mes pénates.
Messages postés
8
Date d'inscription
lundi 11 septembre 2006
Statut
Membre
Dernière intervention
19 septembre 2006

Ah ben moi aussi chuis eu par le refresh. C'est frustrant! ;)
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Bah, on s'y fait lol

<hr size="2" />VC# forever