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