在控件集合中找不到上下文菜单

时间:2009-07-01 19:06:51

标签: c# winforms

我有一张表格。此表单具有用户控件。该用户控件具有面板和上下文菜单。上下文菜单未附加到面板。还有其他控件可动态创建并添加到此面板中。其中一个控件是一个按钮。单击此按钮时,我将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);

3 个答案:

答案 0 :(得分:3)

正如您所正确观察到的,myContextMenu未添加到Controls连接中。 Control具有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做什么的时候看到了你的评论。

如何在Base类中创建一个获取用户详细信息并创建上下文菜单条的方法?

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

在最终表单中,使用此方法获取ContextMenuStrip。

答案 1 :(得分:1)

创建一个派生自contextmenu的自定义上下文菜单(在我的例子中为SecureContextMenu)。实现open事件并遍历项集合,禁用未授权的项目。

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

使用SecureContextMenu,根据授权项目列表检查上下文菜单项。

答案 2 :(得分:0)

它是组件,而不是附加到表单的控件。将它与另一种形式进行比较:您可以手动.Show()从另一种形式的表单,但它们都不会显示在彼此的.Control集合中。好吧,也许这个比喻不是最好的......:s