2017-10-08 4 views
0

J'ai ajouté un contextmenustrip par programmation via l'extension du panneau avec d'autres éléments, Il est défini dans le menu contextuel du panneau via le constructeur du panneau.ContextMenuStrip ne s'affiche pas lors du premier clic droit

La première fois que je clique avec le bouton droit de la souris ne fonctionne pas et après la première fois, cela se produit toujours.

J'ai essayé aussi de mettre le constructeur de la ContextMenuStrip et l'affectation de celui-ci au menu contextuel du panneau dans d'autres endroits tels que charge et le constructeur de la forme et même dans une minuterie avec un drapeau, tous produits de la même résultat ..

EDIT: (une partie du code tel que demandé (tel qu'il est et coupé à des points importants))

class FiniteAutomationController : System.Windows.Forms.Panel 
{ 
    public FiniteAutomationController() 
     : base() 
    { 
    this.ContextMenuStrip = (cms = new ContextMenuStrip()); 
    } 
    public ContextMenuStrip cms; 
} 

EDIT: (par la demande de blaze_125, code plus)

//at form designer initializecomponents after Controller(FiniteAutomationController)'s initialization 

this.Controller.cms.Opening += new System.ComponentModel.CancelEventHandler(this.cms_Load); 

//at form code class 
    static State contextS = null; 
    static Action contextA = null; 
    private void cms_Load(object sender, CancelEventArgs e) 
    { 
     Controller.cms.Items.Clear(); 

     if ((contextS = FiniteAutomationData.GetStateFrom(mouseX, mouseY)) != null) // Rclick States 
     { 
      Controller.cms.Items.Add("Delete"); Controller.cms.Items[0].Click += new EventHandler(cms_DeleteState); 
      Controller.cms.Items.Add("Rename"); Controller.cms.Items[1].Click += new EventHandler(cms_RenameState); 
      Controller.cms.Items.Add((contextS.final ? '\u2714' : ' ') + " Final"); Controller.cms.Items[2].Click += new EventHandler(cms_Final); 
      Controller.cms.Items.Add((contextS.initial ? '\u2714' : ' ') + " Initial"); Controller.cms.Items[3].Click += new EventHandler(cms_Initial); 
      Controller.cms.Items.Add("Trap"); Controller.cms.Items[4].Click += new EventHandler(cms_Trap); 
      if (!contextS.error.Equals("")) 
      { 
       Controller.cms.Items.Add("Error: " + contextS.error); 
       Controller.cms.Items[5].Enabled = false; 
      } 
     } 
     else if((contextA = FiniteAutomationData.GetActionFrom(mouseX,mouseY)) != null) // Rclick Action 
     { 
      Controller.cms.Items.Add("Delete"); Controller.cms.Items[0].Click += new EventHandler(cms_DeleteAction); 
     } 
     else // Rclick null 
     { 
      Controller.cms.Items.Add("Add State"); Controller.cms.Items[0].Click += new EventHandler(cms_AddState); 
     } 
    } 
+0

Montrez-nous du code. –

+0

J'ai ajouté le code que je suppose .. Je ne sais pas combien ce code aurait de l'importance ... – SHsuperCM

+0

À tout le moins, il montre que des efforts ont été faits pour atteindre votre objectif. –

Répondre

0

Au cours des 3 derniers jours, j'ai réussi à trouver une solution qui je pense est un vraiment mauvais, mais une solution encore ..

Ce que je n'est utilisé l'événement MouseDown du contrôleur et en utilisant un drapeau , A montré le menu contextuel sur la première fois en utilisant sa méthode Show (Point). La méthode d'exposition a mis un peu le menu et j'ai choisi "new Point (eX, e.Y + 45)" pour le placer correctement, mais je n'aime toujours pas ce que je fais comme ça semble vraiment non professionnel ..

Merci de toute façon je suppose ..