2009-07-01 47 views
1

我有一个表单。这种形式有一个用户控制。这个用户控件有一个面板和一个上下文菜单。上下文菜单未附加到面板。还有其他控件是动态创建并添加到此面板的。其中一个控件是一个按钮。当您单击此按钮时,我将contextmenustrip属性设置为我的上下文菜单。在控件集合中找不到上下文菜单

我的问题是,我需要阅读该上下文菜单中的项目,然后才有机会将上下文菜单附加到按钮。

每次加载表单时,我都遍历表单的所有子控件。如果一个控件有孩子,我遍历这些,等等......我似乎无法得到未分配可以说的上下文菜单。它没有附加到任何控件上,所以它似乎不是表单上任何控件的子控件。

myConectMenu永远不会添加到用户控制像this.Controls.Add(myConectMenu)。这个上下文菜单如何不能嵌套在表单控件集合中?我怎样才能得到该上下文菜单?

这里是设计师代码:

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); 
} 

更新 控制迭代发生在一个基类,所有的形式在我的应用程序获得。

有一个myContextMenu添加到的私人组件对象。我想这是在那里,所以你可以看到设计视图中的上下文菜单,当它没有连接到控件。也许我可以利用这个?

private System.ComponentModel.IContainer components = null; 

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

你能解释一下你想用ContextMenuStrip做什么吗? – 2009-07-01 19:13:26

+0

迭代其子控件并禁用用户无权访问的项目。 – 2009-07-01 19:45:32

回答

1

创建一个从contextmenu派生的自定义contextmenu(在我的情况下是SecureContextMenu)。实施打开的事件并遍历项目集合,禁用未授权的项目。

确保在第一次打开事件触发时创建HasBeenOpened属性并将其设置为true,以便每次打开上下文菜单时不必检查相同的控件。

使用SecureContextMenu无论您希望在授权项目列表中检查上下文菜单项目。

0

这是一个部件,而不是一个控制附接到形式。将它与其他表单进行比较:您可以手动从另一个表单中显示()一个表单,但它们都不会显示在对方的.Control集合中。那么,也许这种比喻不是最好的...:s

+0

有没有办法从表单的基类中获取该组件? – 2009-07-01 21:50:43

3

正如你所看到的,myContextMenu不会被添加到控件连接。控件具有您应该检查的ContextMenuStrip属性。

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); 
    } 
} 

将相关代码放在DoSomethingWithContextMenuStrip方法中。

编辑:

我看到你的评论,你指定你想用的ContextMenuStrip做什么。

如何在基类中创建一个方法,该方法接受用户详细信息并创建一个上下文菜单条?

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

在您的最终形式中,使用此方法获取ContextMenuStrip。

+0

如果通过contextmenustrip属性将上下文菜单分配给控件,则此方法效果很好。就我而言,在用户与表单交互之前,上下文菜单并未分配给控件。我需要在任何用户交互之前找到该上下文菜单。 – 2009-07-01 21:22:42

相关问题