动态创建菜单使得程序灵活性大大增加,本文根据读取xml文件中的配置菜单项来动态创建菜单,代码如下:
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using WinformMenu.Helper; using System.Xml;namespace WinformMenu
{ public partial class FrmAddMenu : Form { public FrmAddMenu() {InitializeComponent();
}
private void FrmAddMenu_Load(object sender, EventArgs e)
{ MenuStrip menuS = new MenuStrip(); menuS.Parent = this; string xmlFileName = @"F:\c#工程\WinformMenu\WinformMenu\XML\菜单.xml"; createMenu(xmlFileName, menuS); } public void createMenu(string xmlFileName, MenuStrip menuS) { //1:根据XmlElement创建菜单 //XmlNode node = xmlHelper.GetXmlNode(xmlFileName, "//MangeTvMenu"); //foreach (XmlNode xml in node.ChildNodes) //{ // ToolStripMenuItem mainMenu=new ToolStripMenuItem(); // mainMenu.Text = xml.Attributes["descript"].Value; // menuS.Items.Add(mainMenu); // if (xml.HasChildNodes) // { // CreateSubMenuByNode(xml, mainMenu); // } //} //2:根据XmlNode创建菜单 XmlElement xml = xmlHelper.GetXmlElement(xmlFileName); foreach (XmlElement xel in xml.ChildNodes) { ToolStripMenuItem mainMenu = new ToolStripMenuItem(); mainMenu.Text = xel.Attributes["descript"].Value; menuS.Items.Add(mainMenu); if (xml.HasChildNodes) { CreateSubMenuByElement(xel, mainMenu); } } }/// <summary>
/// 根据node节点递归创建菜单 /// </summary> /// <param name="xNode"></param> /// <param name="menuItem"></param> public void CreateSubMenuByNode(XmlNode xNode, ToolStripMenuItem menuItem) { foreach (XmlNode xml in xNode.ChildNodes) { ToolStripMenuItem subMenu = new ToolStripMenuItem(); if (xml.ChildNodes.Count > 1) { subMenu.Text = xml.Attributes["descript"].Value; menuItem.DropDown.Items.Add(subMenu); CreateSubMenuByNode(xml, subMenu); } else { subMenu.Text = xml.InnerText; menuItem.DropDown.Items.Add(subMenu); } } }/// <summary>
/// 根据元素节点递归创建菜单 /// </summary> /// <param name="xml"></param> /// <param name="menuItem"></param> public void CreateSubMenuByElement(XmlElement xml, ToolStripMenuItem menuItem) { foreach (XmlElement xel in xml.ChildNodes) { ToolStripMenuItem subMenu = new ToolStripMenuItem(); if (xel.ChildNodes.Count>1) { subMenu.Text = xel.Attributes["descript"].Value; menuItem.DropDown.Items.Add(subMenu); CreateSubMenuByElement(xel, subMenu); } else { subMenu.Text = xel.InnerText; menuItem.DropDown.Items.Add(subMenu); } } } /// } }xml文件格式如下:
<?xml version="1.0" encoding="utf-8" ?>
<MangeTvMenu descript="管理"> <Add descript="添加"> <Employee>员工</Employee> <Deptment>部门</Deptment> </Add> <EmployeeInfo descript="员工信息"> <BaseInfo>个人基本信息</BaseInfo> <StudyInfo>学历信息</StudyInfo> <MarryInfo>婚姻信息</MarryInfo> </EmployeeInfo> <DeptmentInfo descript="部门信息"> <dept1>部门1</dept1> <dept2>部门2</dept2> </DeptmentInfo> <MoneyManage descript="工资管理"> <BaseMoney>基本工资</BaseMoney> <OtherMoney>绩效工资</OtherMoney> </MoneyManage> <Apply descript="申请"> <AddWork>加班</AddWork> <ApplyWeek>请假</ApplyWeek> <AddMoney>加薪</AddMoney> <Another>其他</Another> </Apply> </MangeTvMenu>效果如下图所示:
xmlHelper为自己写的一个操作xml的类,由于比较简单在此就不贴代码了。
发现如果将xel.ChildNodes.Count>1(也就是上面红色字体代码)换成xel.HasChildNodes程序就会报错,目前正在思考此问题,欢迎广大朋友指点。