博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# winform读取xml创建菜单
阅读量:4843 次
发布时间:2019-06-11

本文共 3208 字,大约阅读时间需要 10 分钟。

  动态创建菜单使得程序灵活性大大增加,本文根据读取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程序就会报错,目前正在思考此问题,欢迎广大朋友指点。

 

转载于:https://www.cnblogs.com/james1207/p/3320283.html

你可能感兴趣的文章
构造函数中的异常处理(转)
查看>>
SI Macro
查看>>
jquery动态调整div大小使其宽度始终为浏览器宽度
查看>>
这篇文章主要为大家详细介绍了jQuery密码强度验证控件使用详解的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...
查看>>
寒假作业
查看>>
iframe内联网页的应用
查看>>
android 开发 View _13 绘制图片与BitmapShader位图的图像渲染器
查看>>
[bzoj2131]免费的馅饼 树状数组优化dp
查看>>
CreateMutex()参数报错问题
查看>>
Linux三剑客-常用命令
查看>>
Excel的列数以数字格式查看
查看>>
unity 2d 和 NGUI layer
查看>>
Sublime Text shift+ctrl妙用、Sublime Text快捷组合键大全
查看>>
spring security中当前用户信息
查看>>
[中国寒龙出品]VB程序设计视频第十四课,更多请关注我们的官博。
查看>>
LinuxMint 17.1 Cinnamon桌面窗口焦点bug
查看>>
PHP函数
查看>>
缩点 CF893C Rumor
查看>>
Spring详解篇之 AOP面向切面编程
查看>>
COMP0037 Coursework
查看>>