Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';在控件集合中找不到上下文菜单_C#_Winforms - Fatal编程技术网

C# Can';在控件集合中找不到上下文菜单

C# Can';在控件集合中找不到上下文菜单,c#,winforms,C#,Winforms,我有一张表格。此表单具有用户控件。此用户控件有一个面板和上下文菜单。关联菜单未附加到面板。还有其他动态创建并添加到此面板的控件。其中一个控件是按钮。单击此按钮时,我将contextmenustrip属性设置为我的关联菜单 我的问题是,在有机会将关联菜单附加到按钮之前,我需要阅读该关联菜单中的项目 每次加载表单时,我都会迭代表单的所有子控件。如果控件有子控件,我将遍历这些子控件,依此类推。。。我似乎看不到所谓未分配的上下文菜单。它尚未附加到任何控件,因此它似乎不是窗体上任何控件的子控件 MyCon

我有一张表格。此表单具有用户控件。此用户控件有一个面板和上下文菜单。关联菜单未附加到面板。还有其他动态创建并添加到此面板的控件。其中一个控件是按钮。单击此按钮时,我将contextmenustrip属性设置为我的关联菜单

我的问题是,在有机会将关联菜单附加到按钮之前,我需要阅读该关联菜单中的项目

每次加载表单时,我都会迭代表单的所有子控件。如果控件有子控件,我将遍历这些子控件,依此类推。。。我似乎看不到所谓未分配的上下文菜单。它尚未附加到任何控件,因此它似乎不是窗体上任何控件的子控件

MyConnectMenu从未像这样添加到用户控件中。Controls.Add(MyConnectMenu)。该上下文菜单如何不嵌套在窗体控件集合中?我怎样才能找到快捷菜单

以下是设计器代码:

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

它是一个组件,而不是附加到窗体的控件。将它与另一个窗体进行比较:您可以手动.Show()从另一个窗体中选择一个窗体,但它们都不会显示在彼此的.Control集合中。嗯,也许这个类比不是最好的…:正如您正确观察到的,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。

创建一个从contextmenu派生的自定义contextmenu(在我的例子中是SecureContextMenu)。实现open事件并遍历items集合,禁用未授权的项

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


根据授权项列表检查上下文菜单项时,可以在任何地方使用SecureContextMenu。

能否解释一下您想对ContextMenuStrip执行什么操作?遍历其子控件并禁用用户无权访问的项。如果上下文菜单通过contextmenustrip属性。在我的例子中,上下文菜单在用户与表单交互之前不会分配给控件。我需要在任何用户交互之前找到上下文菜单。在这种情况下,我唯一能想到的就是让基类有一个方法来向控件添加ContextMenuStrip。在这个方法中,你可以随心所欲地操纵ContextMenuStrip。好主意。你给了我另一个主意。看看我的anwser。有没有一种方法可以让我从表单的基类中获得该组件?我认为这甚至比我推荐的更好。干得好。:)