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