2009-07-01 22 views
1

J'ai un formulaire. Ce formulaire a un contrôle utilisateur. Ce contrôle utilisateur a un panneau et un menu contextuel. Le menu contextuel n'est pas attaché au panneau. D'autres contrôles sont créés dynamiquement et ajoutés à ce panneau. L'un de ces contrôles est un bouton. Lorsque vous cliquez sur ce bouton, je définis la propriété contextmenustrip sur mon menu contextuel.Impossible de trouver le menu contextuel dans la collection de contrôle

Mon problème est que j'ai besoin de lire les éléments dans ce menu contextuel avant d'avoir la possibilité d'attacher le menu contextuel au bouton.

Chaque fois qu'un formulaire est chargé, j'itéère tous les contrôles enfants du formulaire. Si un contrôle a des enfants, je les passe en revue, et ainsi de suite ... Je n'arrive pas à trouver le menu contextuel qui n'est pas assigné pour ainsi dire. Il n'a été associé à aucun contrôle et ne semble donc pas être un contrôle enfant des contrôles du formulaire. MyConectMenu n'est jamais ajouté à la configuration de l'utilisateur comme ceci.Controls.Add (myConectMenu)

Comment ce menu contextuel ne peut-il pas être imbriqué dans la collection de contrôles de formulaires? Comment puis-je accéder à ce menu contextuel?

Voici le code de créateur:

private System.Windows.Forms.ContextMenuStrip myContextMenu; 

void InitializeComponent() 
{ 
    this.myContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); 
    this.myContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 
    this.myToolStripMenuItem1, 
    this.myToolStripMenuItem2}); 
    this.myContextMenu.Name = "myContextMenu"; 
    this.myContextMenu.Size = new System.Drawing.Size(158, 92); 
} 

Mise à jour L'itération de contrôle se produit dans une classe de base à partir de laquelle toutes les formes dans mon application dérivent.

Il existe un objet de composants privés auquel myContextMenu est ajouté. J'imagine que c'est là pour que vous puissiez voir le menu contextuel en mode Création quand il n'est pas attaché à un contrôle. Peut-être que je pourrais tirer parti de cela?

private System.ComponentModel.IContainer components = null; 

this.myContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); 
+0

Pouvez-vous expliquer ce que vous voulez faire avec ContextMenuStrip? –

+0

parcourir les contrôles enfants et désactiver les éléments auxquels un utilisateur n'a pas accès. –

Répondre

1

Créez un menu contextuel personnalisé (SecureContextMenu dans mon cas) qui dérive du menu contextuel. Implémentez l'événement open et parcourez la collection d'éléments en désactivant les éléments non autorisés.Assurez-vous de créer une propriété HasBeenOpened et définissez-la sur true la première fois que l'événement open se déclenche afin de ne pas devoir continuer à vérifier les mêmes contrôles chaque fois que le menu contextuel est ouvert. Utilisez le SecureContextMenu partout où vous souhaitez que les éléments du menu contextuel soient comparés à la liste des éléments autorisés.

+1

Je pense que c'est encore mieux que ce que j'ai prorodé. Bon travail. :) – SolutionYogi

0

Il est un composant et non un contrôlejoint au formulaire. Comparez-le à un autre formulaire: vous pouvez manuellement .Show() un formulaire d'un autre formulaire, mais ni l'un ni l'autre ne s'afficheront dans la collection .Control de l'autre. Eh bien, peut-être que cette analogie n'était pas la meilleure ...: s

+0

Y a-t-il un moyen d'avoir ce composant dans la classe de base du formulaire? –

3

Comme vous l'avez observé correctement, myContextMenu n'est pas ajouté à la connexion Controls. Control a la propriété ContextMenuStrip que vous devriez vérifier.

public void FindContextMenuStrip(Control input) 
{ 
    foreach(Control control in input.Controls) 
    { 
     if(control.ContextMenuStrip != null) 
      DoSomethingWithContextMenuStrip(control.ContextMenuStrip) 

     if(control.Controls.Count > 0) 
      FindContextMenuStrip(control); 
    } 
} 

Placez le code approprié dans la méthode DoSomethingWithContextMenuStrip.

EDIT:

J'ai vu votre commentaire où vous avez spécifié ce que vous vouliez faire avec ContextMenuStrip.

Que diriez-vous de créer une méthode dans la classe Base qui prend les détails de l'utilisateur et crée une bande de menu contextuel?

public ContextMenuStrip GetContextMenuStripForUser(User user) 
{ 
    //code to create context menu strip, with only those items enabled for which user has access. 
} 

Dans votre forme finale, utilisez cette méthode pour obtenir ContextMenuStrip.

+0

Cela fonctionne très bien si le menu contextuel est assigné à un contrôle via la propriété contextmenustrip. Dans mon cas, le menu contextuel n'est pas affecté à un contrôle tant que l'utilisateur n'a pas interagi avec le formulaire. J'ai besoin de trouver ce menu contextuel avant toute interaction de l'utilisateur. –

+1

Dans ce cas, la seule chose à laquelle je peux penser est que votre classe de base dispose d'une méthode pour ajouter ContextMenuStrip à un contrôle. Et dans cette méthode, vous pouvez manipuler le ContextMenuStrip comme vous le souhaitez. – SolutionYogi

+0

Bonne idée. Tu m'as donné une autre idée. Regarde mon anwser. –

Questions connexes