【问题标题】:How to reference a Menu Item via Tag or name如何通过标签或名称引用菜单项
【发布时间】:2013-04-04 16:44:16
【问题描述】:

我正在研究访问控制列表,我必须根据分配的角色在其中显示/隐藏菜单项。我已经通过 TAG 参考了每个菜单项。现在我有一个存储所有 TAG 名称的数组。

是否有可能我只是循环通过标记名称数组,并仅通过标记或名称引用菜单项控件,而不循环通过所有 menuStrip 项并比较当前控件并使其可见?

谢谢

【问题讨论】:

    标签: c# toolstripmenu


    【解决方案1】:

    我不完全理解您想要实现的目标,但也许这段代码对您有所帮助:

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

    【讨论】:

    • 好吧,然后根据您的需要调整上面的代码。顺便说一句,它使用 System.Reflection 和 System.Linq。您可以省略 menus 变量,只与您想要的特定标签进行比较。
    • var member = mnu.GetValue(this) as MenuStrip; 它总是以 NULL 的形式出现。我不能只获取 member.Tag 吗?我可以看到 Name 属性,但看不到 Tag
    【解决方案2】:

    我想我现在理解得更好了。以下代码使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 必须是包含菜单的表单。

    【讨论】:

    • 是否也会搜索第 n 级的儿童?
    • 如果您正在枚举 ToolSrimMenuItems:是的。
    猜你喜欢
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多