需求背景:
最近需要把多个一级菜单做二级菜单的整合
实现思路:
如果你觉得属性值设置菜单比较慢或者更喜欢用尽可能少的代码来动态绑定菜单,不妨看看下面的代码,或许能给你得到帮助,然后你可以把菜单事件单独写到一个时间方法,通过反射自动反射统一调用
我这里分离出来是做一个用户控件加载到winfrom窗口
菜单绑定代码
public void InitView(EventHandler eventhandler) { if (this.menu.Items.Count > 0) { this.menu.Items.Clear(); } MenuStrip ms = this.menu; //添加菜单一 var fileItem = ms.Items.AddContextMenu("文件"); fileItem.DropDownItems.AddContextMenu("tsddmiCreateMock", "新建模拟数据", eventhandler); fileItem.DropDownItems.AddContextMenu("-"); fileItem.DropDownItems.AddContextMenu("tsddmiOpenFile", "打开文件", eventhandler); fileItem.DropDownItems.AddContextMenu("-"); fileItem.DropDownItems.AddContextMenu("tsddmiOpenFile", "打开文件", eventhandler); fileItem.DropDownItems.AddContextMenu("-"); fileItem.DropDownItems.AddContextMenu("tsddmiSave", "保存", eventhandler); fileItem.DropDownItems.AddContextMenu("-"); fileItem.DropDownItems.AddContextMenu("tsddmiSaveAs", "另存为", eventhandler); //添加菜单二 var editItem = ms.Items.AddContextMenu("编辑"); editItem.DropDownItems.AddContextMenu("tsmiClearData", "清空数据", eventhandler); editItem.DropDownItems.AddContextMenu("-"); editItem.DropDownItems.AddContextMenu("tsmiMergeOtherFile", "合并入其他文件", eventhandler); editItem.DropDownItems.AddContextMenu("-"); editItem.DropDownItems.AddContextMenu("tsmiMergeLonggongQAData", "合并入龙宫QA数据", eventhandler); editItem.DropDownItems.AddContextMenu("-"); editItem.DropDownItems.AddContextMenu("tsmiMergeLonggongProData", "合并入龙宫正式数据", eventhandler); //添加菜单三 ms.Items.AddContextMenu("tsmiCompare", "比对", eventhandler); //添加菜单四 ms.Items.AddContextMenu("tsmiReportGeneration", "生成报表", eventhandler); } public virtual void menuStrip_ItemClicked(object sender, EventArgs e) { var tsmi = sender as ToolStripMenuItem; String methodName = tsmi.Name + "_Click"; MethodInfo method = this.GetType().GetMethod(methodName, System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (method == null) { MessageBox.Show("找不到方法" + methodName, "发生错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { try { method.Invoke(this, null); } catch (Exception ex) { MessageBox.Show(ex.ToString(), tsmi.Text + "发生错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } }
菜单事件代码(代码内容清空了,根据自己需要编写)
#region 菜单一(文件)事件 private void tsddmiCreateMock_Click() { } private void tsddmiOpenFile_Click() { } private void tsddmiSave_Click() { } private void tsddmiSaveAs_Click() { } #endregion #region 菜单二(保存)事件 private void tsmiClearData_Click() { } private void tsmiMergeOtherFile_Click() { } private void tsmiMergeLonggongQAData_Click() { } private void tsmiMergeLonggongProData_Click() { } #endregion #region 菜单三(比对)事件 private void tsmiCompare_Click() { } #endregion #region 菜单四(生成报表)事件 private void tsmiReportGeneration_Click() { } #endregion
动态事件方法
#region ToolStripMenuItem /// <summary>添加子菜单 /// xun-yu.she|2020-08-10 /// </summary> /// <param name="cms">要添加到的子菜单集合即</param> /// <param name="text">要显示的文字,如果为 - 则显示为分割线</param> /// <returns>生成的子菜单,即该级的下一级如果为分隔条则返回null</returns> public static ToolStripMenuItem AddContextMenu(this ToolStripItemCollection cms, string text) { return AddContextMenu(cms, null, text, null); } /// <summary>添加子菜单 /// xun-yu.she|2020-08-10 /// </summary> /// <param name="cms">要添加到的子菜单集合即</param> /// <param name="text">要显示的文字,如果为 - 则显示为分割线</param> /// <param name="callback">点击时触发的事件</param> /// <returns>生成的子菜单,即该级的下一级如果为分隔条则返回null</returns> public static ToolStripMenuItem AddContextMenu(this ToolStripItemCollection cms, string text, EventHandler callback) { return AddContextMenu(cms, null, text, callback); } /// <summary>添加子菜单 /// xun-yu.she|2020-08-10 /// </summary> /// <param name="cms">要添加到的子菜单集合即</param> /// <param name="name">需要反射的name名称记录</param> /// <param name="text">要显示的文字,如果为 - 则显示为分割线</param> /// <param name="callback">点击时触发的事件</param> /// <returns>生成的子菜单,即该级的下一级如果为分隔条则返回null</returns> public static ToolStripMenuItem AddContextMenu(this ToolStripItemCollection cms, string name, string text, EventHandler callback) { if (text == "-") { ToolStripSeparator tsp = new ToolStripSeparator(); cms.Add(tsp); return null; } else if (!string.IsNullOrEmpty(text)) { ToolStripMenuItem tsmi = new ToolStripMenuItem(text); if (!string.IsNullOrEmpty(name))//动态触发的时间需要结合 { tsmi.Name = name; } if (callback != null) { tsmi.Click += callback; } cms.Add(tsmi); return tsmi; } return null; } #endregion
初始化及绑定方式
//在需要的地方调用此方法并初始化菜单及绑定事件 this.ucMenu.InitView(new EventHandler(menuStrip_ItemClicked));