2013-04-04 56 views
0

我正在使用訪問控制列表,其中必須根據分配的角色顯示/隱藏菜單項。我已經通過TAG提到每個菜單項目。現在我有一個數組存儲所有TAG名稱。如何通過標記或名稱引用菜單項

是否有可能我只是循環通過標籤名稱數組,然後通過標籤或名稱引用菜單項控件,而不通過所有menuStrip項目循環並比較當前控件並使其可見?

感謝

回答

0

我不明白你想實現什麼,但也許這個代碼是給你的幫助:

private void button1_Click(object sender, EventArgs e) { 
     var menus = new string[] { "Every", "menu", "you", "want", "to", "show" }; 
     foreach (var mnu in this.GetType().GetFields(
      BindingFlags.Instance | 
      BindingFlags.NonPublic | 
      BindingFlags.GetField)) { 
      var member = mnu.GetValue(this) as MenuStrip; 
      if (null != member) { 
       member.Visible = (menus.Contains(member.Tag.ToString())); 
      } 
     } 
    } 
+0

這裏我解釋一下:http://pastie.org/7310583 – Volatil3 2013-04-04 07:20:35

+0

好吧,然後根據您的需要調整上面的代碼。順便說一句,它使用System.Reflection和System.Linq。你可以省略'menus'變量,只是比較你想要的特定標籤。 – 2013-04-04 07:33:33

+0

* var member = mnu.GetValue(this)as MenuStrip; *它始終爲NULL。我不能只是得到* member.Tag *?我可以看到*名稱*屬性,但沒有標籤 – Volatil3 2013-04-04 07:45:32

0

我想我最好現在明白。以下代碼將使ToolStripMenuItem可見(或更改爲您的對象所在的任何類型)。我使用名稱,因爲使用標籤,您將不得不枚舉所有對象。

private void ShowItem(string menuItemName) { 
     var field = this.GetType().GetField(
      menuItemName, 
      BindingFlags.Instance | 
      BindingFlags.NonPublic | 
      BindingFlags.GetField); 
     var mnu = field.GetValue(this) as ToolStripMenuItem; 
     if (null != mnu) { 
      mnu.Visible = true; 
     } 
    } 

請注意,this必須是包含菜單的窗體。

+0

Wii iit搜索兒童也在第n級? – Volatil3 2013-04-04 08:45:41

+0

如果您正在枚舉ToolStrimMenuItems:是的。 – 2013-04-04 09:56:33

相關問題