begin process at 2010 02 10 01:37:00
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C#

 > 

Archives

 > 

Au secours

 > 

Evenement dynamique (new EventHandler())


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Evenement dynamique (new EventHandler())

mardi 5 juillet 2005 à 20:33:56 | Evenement dynamique (new EventHandler())

bgcode

Membre Club
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 !

mardi 5 juillet 2005 à 20:57:14 | Re : Evenement dynamique (new EventHandler())

Fildomen

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
mardi 5 juillet 2005 à 20:57:54 | Re : Evenement dynamique (new EventHandler())

Fildomen

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
mardi 5 juillet 2005 à 21:06:27 | Re : Evenement dynamique (new EventHandler())

aogie

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 --

mardi 5 juillet 2005 à 21:17:42 | Re : Evenement dynamique (new EventHandler())

bgcode

Membre Club
je comprends absolument rien lol ;)
tu peux expliquer ou tu veux en venir ?
Merci
mardi 5 juillet 2005 à 22:06:41 | Re : Evenement dynamique (new EventHandler())

aogie

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 --
mardi 5 juillet 2005 à 22:27:18 | Re : Evenement dynamique (new EventHandler())

aogie

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>
/// <param name="pt">Coordonnées à tester.</param>
/// <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 --
mardi 5 juillet 2005 à 23:46:08 | Re : Evenement dynamique (new EventHandler())

Lutinore

Administrateur CodeS-SourceS
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 ?
mercredi 6 juillet 2005 à 07:15:46 | Re : Evenement dynamique (new EventHandler())

aogie

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 --
mercredi 6 juillet 2005 à 09:38:01 | Re : Evenement dynamique (new EventHandler())

Lutinore

Administrateur CodeS-SourceS
Réponse acceptée !
Là c'est plus simple à comprendre ; )

1 2

Cette discussion est classée dans : table, composant, tab, eventhandler, ctxmenu


Répondre à ce message

Sujets en rapport avec ce message

EventHandler [ par azraeht ] Bonjour! Je suis en train de développer un composant (un planning) qui hérite du contrôle ASP.NET Table. Je suis en train d'essayer de gérer les Even treeview [ par manelfeki ] Bonjour, je veux remplir ma treeviews a partir des tables differents(base de donner sql server 2005).les noeuts parents se remlies a partir d'ube tabl insertion [ par soniafeki ] Bonjour, voici mon code, mais ca ne lmarche pas pour l'insertion dans la table dans laquel je veux inserer connection.Open(); // Creation NullReferenceException [ par khawlaaa ] bonjour tous le monde ,  voila un bout de code de mon programme : [code]    public static void Main()    {        trame oTrame = new trame();        I connexion [ par soniafeki ] Bonjour je travaille en c# et je veux savoir si une connecxion c'est bien effectuer c'est a dire su je donne le nom d'une base de donne et je demande XML vers Access [ par sveleg ] Bonjour. Je gère un entrepôt logistique pour des produits industriels variés. J'ai de bonnes notions en Access mais aucunes pour le language XML. J'ai Object reference not set to an instance of an object(.length) [ par baby85 ] bonsoir,j'ai un probleme au niveau de .lengthj ai fais une methode qui prend comme parmetre une variable stringpublic string getstrg(string tx)        Recherche automatique [ par RODRIGUEZMOLINE ] Salut,J'aimerais trouver un composant qui me permet de faire des selections automatiques dans un champs texte. par exemple, si je tappe "A", tous les Mon code est trop lent ! [ par alexbesn ] Bonjour à tous. J'ai écris du code mais il est beaucoup trop lent, j'aurai besoin de l'avis d'experts ! Je souhaiterai écrire un programme qui vérif


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,234 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales