Evenement dynamique (new EventHandler())

Résolu
bgcode Messages postés 5 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 23 février 2007 - 5 juil. 2005 à 20:33
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 - 8 juil. 2005 à 20:57
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

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
6 juil. 2005 à 09:38
Là c'est plus simple à comprendre ; )
3
Fildomen Messages postés 805 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 30 octobre 2010
5 juil. 2005 à 20:57
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
0
Fildomen Messages postés 805 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 30 octobre 2010
5 juil. 2005 à 20:57
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
0
aogie Messages postés 108 Date d'inscription vendredi 11 juillet 2003 Statut Membre Dernière intervention 27 novembre 2007
5 juil. 2005 à 21:06
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 --
0

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

Posez votre question
bgcode Messages postés 5 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 23 février 2007
5 juil. 2005 à 21:17
je comprends absolument rien lol ;)
tu peux expliquer ou tu veux en venir ?
Merci
0
aogie Messages postés 108 Date d'inscription vendredi 11 juillet 2003 Statut Membre Dernière intervention 27 novembre 2007
5 juil. 2005 à 22:06
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 --
0
aogie Messages postés 108 Date d'inscription vendredi 11 juillet 2003 Statut Membre Dernière intervention 27 novembre 2007
5 juil. 2005 à 22:27
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 --
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
5 juil. 2005 à 23:46
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 ?
0
aogie Messages postés 108 Date d'inscription vendredi 11 juillet 2003 Statut Membre Dernière intervention 27 novembre 2007
6 juil. 2005 à 07:15
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 --
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
8 juil. 2005 à 20:57
C'est la réponse d'Aogie qu'il faut valider ; )
0
Rejoignez-nous