Création dynamique de MenuItem dans un menu

Résolu
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
-
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
14 février 2014
-
Salut,



voilà, j'ai une arraylist qui est remplit de string au cours de mon
programme. Pour chaque string de cette arraylist, je voudrais rajouter
une case à mon menu déjà présent :



en gros :

Nom_du_menu

menu_choix1

menu_choix2 -> string1

string2


string3


string4



Ca, c'est pas le problème, j'y arrive comme ceci :

private void menu_Selection_Select(object sender, EventArgs e)

{

this.m_selection_materiel.MenuItems.Clear();

//Remplissage arrayList

...

ArrayList am = new ArrayList(); //am pour array_materiel

am.Sort();

foreach (string materiel in am)

{

this.m_selection_materiel.MenuItems.Add(materiel);

}

}



Mais ce que je voudrais, c'est créer un gestionnaire dévènement pour chaque nouvelle case créée dynamiquement.

Je pense que ca doit ressembler à ca :

this.m_selection_materiel.MenuItems.Add(materiel, materiel_on_click(materiel));

mais je ne vois pas comment faire exactement. Chaque case aura la même
action, sauf que la string passée en paramètre sera différente. Comment
je dois faire ?

Un EventHandler pour chaque nouvelle case ? ou un EventHandler unique, auquel je passe le string choisi ?



Merci d'avance...

4 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
14 février 2014
38
tu peux créer une classe dérivant de MenuItem à laquelle tu ajoutes par exemple la propriété Tag.

ex :
public class MenuItemExtend : MenuItem {
private object tag;
public object Tag {
get {return tag;}
set {tag = value;}
}
}

maintenant pour ton menu, tu fais ceci :
private void menu_Selection_Select(object sender, EventArgs e)
{
this.m_selection_materiel.MenuItems.Clear();
//Remplissage arrayList
...
ArrayList am = new ArrayList(); //am pour array_materiel
am.Sort();
MenuItemExtend mnu;
foreach (string materiel in am)
{
mnu = new MenuItemExtend();
mnu.Text = materiel;
mnu.Tag = materiel;
mnu.Click += new EventHandler( mnu_Click );
this.m_selection_materiel.MenuItems.Add(mnu);
}
}

et :
protected void mnu_Click(object sender; EventArgs e) {
switch( (string)((MenuItemExtend)sender).Tag) {
case "bois" :
traitementMenuBois();
break;
...
}
}

Sébastien FERRAND
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
7
A première vue, je pense que ca doit être ce que je voulais...



Je m'en vais tester ça, et je te tiens au courant... : )
Messages postés
497
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
13 juillet 2015
7
C'est génial ! Exactement ce que je voulais...



Selon la case choisie dans le menu, je peux sélectionner les éléments
de ma listview qui correspondent au texte de la case choisie :



private void menu_Selection_Select(object sender, EventArgs e)

{

this.m_selection_materiel.MenuItems.Clear();

ArrayList am = new ArrayList(); //am pour array_materiel



MenuItemExtend mnu;



foreach (ListViewItem mon_item in list_Liste_Fichiers.Items)

{

if (!am.Contains(mon_item.SubItems[6].Text))

{


am.Add(mon_item.SubItems[6].Text);

}

}

am.Sort();

foreach (string materiel in am)

{

mnu = new MenuItemExtend();

mnu.Text = materiel;

mnu.Tag = materiel;

mnu.Click += new EventHandler( mnu_Click );

this.m_selection_materiel.MenuItems.Add(mnu);

}

}



protected void mnu_Click(object sender, EventArgs e)

{

selectionner_par_materiel((string)((MenuItemExtend)sender).Tag);

}



private void selectionner_par_materiel(string materiel)

{

foreach(ListViewItem mon_item in list_Liste_Fichiers.Items)

{

if (mon_item.SubItems[6].Text == materiel)

{

mon_item.Checked = true;

}

}

}



public class MenuItemExtend : MenuItem


{


private object tag;


public object Tag


{


get {return tag;}


set {tag = value;}


}


}


Merci boucou !!!
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Membre
Dernière intervention
14 février 2014
38
de rien ;)

Sébastien FERRAND