2009-08-16 9 views
0

J'écris une application C# (.NET 3.5) avec un usercontrol qui hérite de DataGridView. Lorsque l'utilisateur clique avec le bouton droit sur un en-tête de colonne, je souhaite afficher un menu contextuel.ContextMenu ne s'affiche pas, et je ne sais pas pourquoi

J'ai effectivement trouvé ce travail trouvé sur 2 formulaires dans mon application. Je suis perplexe parce que le ContextMenu ne montrera pas sur le même contrôle sur un troisième formulaire. Je vois que l'événement Popup est déclenché, mais je ne vois pas le menu dessiné à l'écran, et aucun des gestionnaires d'événements de l'élément de menu n'est appelé.

Je n'ai aucune idée de la raison pour laquelle mon menu contextuel n'est pas dessiné, et cela me rend fou.

Malheureusement, mon code est trop complexe pour tout afficher ici ... J'inclus la courte section où je construis et affiche le menu. Je ne suis pas convaincu que le problème est dans ce code, mais je ne sais pas où cela serait.

if (hti.RowIndex == -1) 
{ 
    ClickedColumnHeader = this.Columns[hti.ColumnIndex]; 

    //Build a context menu and show it. 
    ContextMenu mnu = new ContextMenu(); 
    mnu.MenuItems.Clear(); 
    MenuItem mnuHide = new MenuItem("Hide"); 
    mnuHide.Click += new EventHandler(mnuHide_Click); 
    MenuItem mnuRename = new MenuItem("Rename..."); 
    mnuRename.Click += new EventHandler(mnuRename_Click); 
    MenuItem mnuCurrencyFormat = new MenuItem("Format as Currency"); 
    mnuCurrencyFormat.Checked = false; 

    if (this.Columns[hti.ColumnIndex].DefaultCellStyle.Format == "c") 
    { 
     mnuCurrencyFormat.Checked = true; 
    } 
    mnuCurrencyFormat.Click += new EventHandler(mnuCurrencyFormat_Click); 
    MenuItem mnuSeparator = new MenuItem("-"); 
    MenuItem mnuShow = new MenuItem("Show"); 

    foreach (DataGridViewColumn col in this.Columns) 
    { 
     if (col.Visible == false) 
     { 
      MenuItem x = new MenuItem(col.HeaderText); 
      x.Click += new EventHandler(x_Click); 
      mnuShow.MenuItems.Add(x); 
     } 
    } 

    mnu.MenuItems.Add(mnuHide); 
    mnu.MenuItems.Add(mnuRename); 
    mnu.MenuItems.Add(mnuCurrencyFormat); 
    mnu.MenuItems.Add(mnuSeparator); 
    mnu.MenuItems.Add(mnuShow); 

    //for debugging... 
    mnu.Popup += new EventHandler(mnu_Popup); 
    mnu.Collapse += new EventHandler(mnu_Collapse); 

    mnu.Show(this, new System.Drawing.Point(f.X, f.Y)); 
} 

J'apprécierais vraiment toute aide que la communauté pourrait offrir. J'espère vraiment que je fais juste quelque chose de stupide ici.

+1

Vous n'avez pas besoin de montrer tout votre code, mais la construction d'un programme court mais complet qui illustre le problème se serait peut aider vous le résoudre vous-même, et le rendrait * certainement * plus facile pour les autres. –

+0

Je sais. Mais avec plus de 30 fichiers dans le projet, et la commande usercontrol qui a le problème étant 275+ lignes de code, et toutes sortes de dépendances de données, essayant de réduire cela au minimum nécessaire pour repro représente beaucoup de travail. Je n'ai jamais entendu parler de ContextMenu.Show() ne montrant rien. J'espère que quelqu'un d'autre a. Si ce n'est pas le cas, je ferai le travail nécessaire pour arriver à un repro. –

+0

Essayez de faire un diff de vos formes (où le contrôle affiche le menu par rapport à un autre formulaire où il ne fonctionne pas). – shahkalpesh

Répondre

0

yup, pas assez d'informations pour recréer le problème mais puis-je offrir ceci, si vous l'avez travaillé sur les 2 autres formulaires, le problème n'est pas avec votre code hérité. Le problème est avec le 3ème formulaire.

Si vous vous sentez vraiment prendre le temps d'essayer faire un 4 à partir de zéro et voir si les mêmes cultures d'erreur vers le haut. Vérifiez tous les gestionnaires d'événements. Il semble comme vous en avez un câblé sur les formulaires 1 mais pas sur 3.

Questions connexes