zoukankan      html  css  js  c++  java
  • C# WinForm中MenuStrip动态菜单使用总结

    转载请声明出处:http://www.freemansoft.net/blog/Article/438.aspx

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

  • 相关阅读:
    HTML 基础 元素 标签
    HTML5 元素介绍
    网站程序 模板下载 下载 ftp
    域名解析和空间绑定
    如何选择云虚拟主机操作系统?
    网站备案查询
    响应式网站01
    项目中使用百度统计和友盟统计
    项目中使用http referer,为了盗取图片资源
    vue-awesome-swiper中的数据异步加载
  • 原文地址:https://www.cnblogs.com/ewyb/p/2249993.html
Copyright © 2011-2022 走看看