C# WinForm中MenuStrip动态菜单使用总结

    技术2022-05-20  59

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

    1、首先要在数据库里创建一个菜单表TB_MENU,字段主要有--------------------------ID-唯一标识值FATHER_ID-菜单项目的父ID,如果是顶级菜单则为0MENU_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);        }

    本文来自博客,转载请标明出处:http://blog.csdn.net/freespace520/archive/2010/06/17/5674932.aspx


    最新回复(0)