首页 WinForm/WPF Winform动态加载多级MenuStrip菜单

Winform动态加载多级MenuStrip菜单

作者:胡同里的砖头 围观群众:744 更新于:2017-10-18

在C# WinForm中使用菜单控件,我想MenuStrip是很多人的首选,如何使用我就不多说了,我就讲讲个人的使用心得。
以前在使用该控件的时候只知道在窗体设计器中手动输入菜单项目,这样做是比较方便,但却不灵活。
某次要做的一个项目,涉及到权限分配,不同权限的人需要用到不同的菜单,这就需要在窗体载入的时候动态创建MenuStrip及其菜单项目。
后来上网搜索了很多相关创建动态菜单的代码,但却都不理想,最后只能自己取各家所长,自己动手修改完成了这个东西。
我的思路是这样的:

1、首先要在数据库里创建一个菜单表TB_MENU,字段主要有
--------------------------
ID-唯一标识值
FATHER_ID-菜单项目的父ID,如果是顶级菜单则为0
MENU_NAME-该菜单项在窗体中的控件名称
MENU_TEXT-该菜单项显示名称
MODULE_ACTION-该菜单项目要招待的事件名称,带括号,例如:btnCreateUser_click()
--------------------------
这些字段是必需的,其他的就要根据你的实际情况而定了。

2、在窗体中拖放一个MenuStrip控件,名称为MainMenu1

3、在窗体代码的FORM_LOAD中加入以下语句:CreateMenu();
当然如果情况特殊,也可以在别的地方加入该句代码,视实际情况自己决定。

4、在相关窗体代码中加入以下构造函数

    public void CreateMenu()
        {
          
            //取所有菜单项的语句,如果有权限限制等情况自行修改
            String menuSql="select * from TB_MENU";
            //取得菜单项数据集
            DataSet ds = DbClass.getDataSet(menuSql);
            //检查判断DataSet数据是否完整
            if (CheckData(ds))
            {
                //加载MenuStrip菜单
                ToolStripMenuItem topMenu = new ToolStripMenuItem();
                LoadSubMenu(ref topMenu, "0");
            }
         
        }

        /// <summary>
        /// 递归创建MenuStrip菜单(模块列表)
        /// </summary>
        /// <param name="topMenu">父菜单项</param>
        /// <param name="FATHER_ID">父菜单的ID</param>
        private void LoadSubMenu(ref ToolStripMenuItem topMenu, String inFatherId)
        {
            DataView dvList = new DataView(menuTable);
            //过滤出当前父菜单下在所有子菜单数据(仅为下一层的)
            dvList.RowFilter = "FATHER_ID='" + inFatherId + "'";
            ToolStripMenuItem subMenu;
            foreach (DataRowView dv in dvList)
            {
                //创建子菜单项
                subMenu = new ToolStripMenuItem();
                subMenu.Name = dv["MENU_NAME"].ToString();
                subMenu.Text = dv["MENU_TEXT"].ToString();

                //判断是否为顶级菜单
                if (inFatherId == "0")
                {
                    MainMenu1.Items.Add(subMenu);
                }
                else
                {
                    subMenu.Tag = dv["MODULE_ACTION"].ToString();
                    String str = " void " + dv["MODULE_ACTION"].ToString();
                    //给菜单项加事件。
                    subMenu.Click += new EventHandler(subMenu_Click);

                    topMenu.DropDownItems.Add(subMenu);
                }

                //递归调用
                LoadSubMenu(ref subMenu, dv["ID"].ToString());

            }

        }


        /**/
        /// <summary>
        /// 菜单单击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void subMenu_Click(object sender, EventArgs e)
        {

            try
            {
                //tag属性在这里有用到。
                string acName = ((ToolStripMenuItem)sender).Tag.ToString();

                if (acName != "")
                {
                    string[] strArray = acName.Split(new char[] { ',' });
                    if (strArray.Length > 2)
                    {
                    }
                    else
                    {
                        String str = "void " + acName;
                        foreach (MethodInfo info in base.GetType().GetMethods())
                        {
                            if (str.Trim().ToLower().CompareTo(info.ToString().Trim().ToLower()) == 0)
                            {
                                info.Invoke(this, null);
                            }
                        }
                    }
                }
            }
            catch (Exception exception)
            {

            }
        }

        //检查判断DataSet数据是否完整
        public static bool CheckData(DataSet inData)
        {
            bool flag = false;
            if (CheckTable(inData))
            {
                for (int i = 0; i < inData.Tables.Count; i++)
                {
                    if (inData.Tables.Rows.Count > 0)
                    {
                        flag = true;
                    }
                }
                return flag;
            }
            return false;
        }
       public static bool CheckTable(DataSet inData)
        {
            if (inData == null)
            {
                return false;
            }
            return (inData.Tables.Count > 0);
        }

  • 本文标题: Winform动态加载多级MenuStrip菜单
  • 文章分类:【WinForm/WPF】
  • 非特殊说明,本文版权归【胡同里的砖头】个人博客 所有,转载请注明出处.
留言评论
站点声明:
1、本站【胡同里的砖头】个人博客,借鉴网上一些博客模板,取其各优点模块自行拼装开发,本博客开发纯属个人爱好。
2、所有笔记提供给广大用户交流使用,可转载,可复制,纯个人开发所遇问题锦集记录使用
Copyright © huzlblog.com All Rights Reserved. 备案号:苏ICP备2021056683号-8