Evenement dynamique (new EventHandler()) [Résolu]

Signaler
Messages postés
5
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
23 février 2007
-
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
-
Bonjour , je m'explique :
Ce que je veux concevoir ,
Sur une form , par un clic sur un bouton je dessine sur celle ci un composant nommé GraphPicture puis j'y construit un menu :


AOGie.
GraphPicture tab =
new AOGie.
GraphPicture();


tab.Name =
"table" + nb_click;
//Identifiant
tab.Location =
new
Point(200, 200);
//Place par défaut dans la fenetre
tab.Size =
new
Size(table_x, table_y);
//taille
tab.BackColor =
Color.Aqua;
tab.ToolTipText =
"Clic droit pour modifier la table";

this.graphContainer1.Controls.Add(tab);


ContextMenu ctxMenu =
new
ContextMenu();



// ON creé plusieurs menuitem puis pour chaque on definit un evenement (defini par nous meme)


ctxMenu.MenuItems.Add(
new
MenuItem(
"Champs de la table",
new
EventHandler(modifs_champs)));
ctxMenu.MenuItems.Add(
new
MenuItem(
"Modifier les dimensions",
new
EventHandler(changer_dimensions)));
ctxMenu.MenuItems.Add(
new
MenuItem(
"Changer les couleurs",
new
EventHandler(changer_couleurs)));
tab.ContextMenu = ctxMenu;
//on l'affiche !

Voila ca ca fonctionne , ca me construit bien mon menu sur chaque composant dynamique sur ma feuille
Mais ca se complique lorsque je veux savoir de quelle composant ou j'y ai cliqué sur un item du menu.


private void changer_couleurs(object sender, EventArgs e)
{

Cet evenement a été provoqué par quel composant géneré dynamiquement ?
Comment le savoir ?
}



Vous sauriez me dire de quel composant géneré dynamiquement correspond le clic sur son item.
Si vous voyez ce que je veux dire .
Merci bcp !

10 réponses

Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Là c'est plus simple à comprendre ; )
Messages postés
805
Date d'inscription
jeudi 22 mai 2003
Statut
Membre
Dernière intervention
30 octobre 2010

MenuItem fildo = (MenuItem) e;

c l'item qui l'a généré, tu peux mettre dans son tag qlq chose pour se souvenir de lui

Bonne chance...
YaoYao !!
1 + 1 = 10
Messages postés
805
Date d'inscription
jeudi 22 mai 2003
Statut
Membre
Dernière intervention
30 octobre 2010

MenuItem fildo = (MenuItem) sender;

c l'item qui l'a généré, tu peux mettre dans son tag qlq chose pour se souvenir de lui

Excuse pour la faute

Bonne chance...

YaoYao !!
1 + 1 = 10
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

Bonsoir,


Le fait que les objets GraphLine ne soient pas des contrôles visuels, permet une superposition des lignes grâce à gestion effectuée par GraphContainer.


Le point négatif c'est que c'est lui qui gère la position de la souris et qui est reconnu comme SourceControl par le menu contextuel.
Dans l'événement de clic sur menu :


MenuItem mn = (MenuItem)sender;
ContextMenu ctxMenu = mn.GetContextMenu();
Control ctl = ctxMenu.SourceControl;


Le contrôle ctl est le GraphContainer et non l'objet GraphLine...

Solutions :
- 1) Implémenter une méthode GetGraphLineAt(Point pt). Ce n'est pas trop difficile car il suffit de s'inspirer de la méthode privée "ProcessMouseMove" pour trouver l'objet GraphLine à retourner.
- 2) Créer un menu contextuel différent pour chaque objet GraphLine. On peut ainsi reconnaître l'appelant...

La solution 1) est la plus propre. En cas de difficulté. Je me tiens à ta disposition pour créer cette méthode dans l'objet GraphContainer.

-- AOGie --
Messages postés
5
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
23 février 2007

je comprends absolument rien lol ;)
tu peux expliquer ou tu veux en venir ?
Merci
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

Si tu consultes le code des objets du projet GraphContainer, tu remarqueras que les objets GraphLine ne sont pas des "contrôles visuels".
L'événement MouseMove est géré par le GraphContainer et les coordonnées de la souris sont dans le référenciel du GraphContainer et non de l'objet GraphLine survolé. C'est pour cette raison que l'affichage du menu contextuel possède l'objet GraphContainer comme contrôle associé.

-- AOGie --
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

Solutions :
1) Pour connaître l'objet GraphLine à l'origine du menu contextuel. Inscription sur l'événement MouseUp de chaque objet GraphLine comprenant le menu contextuel. (Tu peux éventuellement utiliser le même handler pour tous et tester le sender)
Ensuite, if (e.Button = = MouseButtons.Right) c'est que le menu contextuel va s'afficher. Tu conserve dans une variable membre le dernier contrôle ayant affiché le menu contextuel (sender). Lors du clic sur un élément du menu, tu consultes cette variable...

2) Pour éventuellement obtenir un objet GraphLine à partir de coordonnées dans le référentiel du GraphContainer, ajoute cette méthode dans la région des méthodes publiques de l'objet GraphContainer :


#region GetLineAt

/// <summary>
/// Extrait l'objet GraphLine situé à l'emplacement spécifié.
/// </summary>
/// Coordonnées à tester.

/// <returns>Objet GraphLine ou null.</returns>
public GraphLine GetLineAt(Point pt)
{

lock (_lines.SyncRoot)
{

foreach (GraphLine line
in _lines)
{

if (line.ContainsMouse(pt))
return line;
}
}

return
null;
}


#endregion

Bon code

-- AOGie --
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
Ohlala j'ai rien compris non plus, lol ! Aogie tu veux dire que c'est pas la peine de caster le sender en MenuItem, ca ne renvoie pas vraiment l'objet à l'origine de l'événement ?
Messages postés
108
Date d'inscription
vendredi 11 juillet 2003
Statut
Membre
Dernière intervention
27 novembre 2007

Imaginons 2 lignes : line1 et line2 et une variable membre _lastLine de type GraphLine.
1ère possibilité :

line1.MouseUp +=
new MouseEventHandler(line1_MouseUp);
line2.MouseUp +=
new MouseEventHandler(line2_MouseUp);


private void line1_MouseUp(object sender, MouseEventArgs e)
{

if (e.Button = = MouseButtons.Right) _lastLine = line1; // mise à jour de la variable membre de type GraphLine
}


private void line2_MouseUp(object sender, MouseEventArgs e)
{

if (e.Button = = MouseButtons.Right) _lastLine = line2; // mise à jour de la variable membre de type GraphLine
}

ou

2ème possibilité :


line1.MouseUp + = new MouseEventHandler(lines_MouseUp);
line2.MouseUp +=
new MouseEventHandler(lines_MouseUp);


private void lines_MouseUp(object sender, MouseEventArgs e)
{

if (e.Button = = MouseButtons.Right) _lastLine = (GraphLine)sender; // mise à jour de la variable membre de type GraphLine
}

Dans l'événement de clic sur un élément de menu, la variable _lastLine te donne l'objet à l'origine du menu contextuel...

-- AOGie --
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
C'est la réponse d'Aogie qu'il faut valider ; )