動態創建菜單使得程序靈活性大大增加,本文根據讀取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>