动态创建菜单使得程序灵活性大大增加,本文根据读取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>

效果如下图所示:

 c# winform读取xml创建菜单_递归

xmlHelper为自己写的一个操作xml的类,由于比较简单在此就不贴代码了。

发现如果将xel.ChildNodes.Count>1(也就是上面红色字体代码)换成xel.HasChildNodes程序就会报错,目前正在思考此问题,欢迎广大朋友指点。