2009-07-01 29 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