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

c# winform读取xml创建菜单的更多相关文章

  1. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

    前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

  2. c#读取xml文件配置文件Winform及WebForm-Demo具体解释

    我这里用Winform和WebForm两种为例说明怎样操作xml文档来作为配置文件进行读取操作. 1.新建一个类,命名为"SystemConfig.cs".代码例如以下: < ...

  3. 在C#中创建和读取XML文件

    1.创建简单的XML文件 为了便于测试,我们首先创建控制台应用程序,项目命名为CreateXml,Program.cs代码如下: 这样会在C盘根目录下创建data2.xml文件,文件内容为 using ...

  4. Java读取、创建xml(通过dom方式)

    创建一个接口 XmlInterface.java public interface XmlInterface {           /**         * 建立XML文档         * @ ...

  5. TinyXML2读取和创建XML文件 分类: C/C++ 2015-03-14 13:29 94人阅读 评论(0) 收藏

    TinyXML2是simple.small.efficient C++ XML文件解析库!方便易于使用,是对TinyXML的升级改写!源码见本人上传到CSDN的TinyXML2.rar资源:http: ...

  6. 【java开发系列】— JDOM创建、改动、删除、读取XML文件

    有非常多中操作XML文件的方法,这里介绍一下JDOM的用法和技巧. JDOM下载地址 创建XML文档 XML文件是一种典型的树形文件,每一个文档元素都是一个document元素的子节点. 而每一个子元 ...

  7. 使用LINQ TO XML 创建xml文档,以及读取xml文档把内容显示到GridView例子

    首先,准备了一个Model类 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  8. 【java开发系列】—— JDOM创建、修改、删除、读取XML文件

    有很多中操作XML文件的方法,这里介绍一下JDOM的使用方法和技巧. JDOM下载地址 创建XML文档 XML文件是一种典型的树形文件,每个文档元素都是一个document元素的子节点.而每个子元素都 ...

  9. C# 递归读取XML菜单数据

    在博客园注册了有4年了,很遗憾至今仍未发表过博客,趁周末有空发表第一篇博客.小生不才,在此献丑了! 最近在研究一些关于C#的一些技术,纵观之前的开发项目的经验,做系统时显示系统菜单的功能总是喜欢把数据 ...

随机推荐

  1. 不可以为null值的自定义类型

    1.今天早上编码发现,这很奇怪 再一看,原来是DateTime类型,DateTime进去一看发现时Struct类型,原来如此

  2. php7 install script

    ./configure --prefix=/home/admin/local/php7 --with-gd=/home/admin/local/libgd-2.1.1/ --with-jpeg-dir ...

  3. C#正则提取HTML中img的url值

    /// <summary> /// 取得HTML中所有图片的 URL. /// </summary> /// <param name="sHtmlText&qu ...

  4. Docker镜像与仓库(二)Dockerfile

    Docker镜像文件与仓库(二) Docker镜像文件与仓库(二) Dockerfile指令 Dockerfile格式: 1.#Comment注释2.INSTRUCTION大写的指令名 argumen ...

  5. linux杂记(二)主机硬盘规划

    linux安装过程中,至少要两个partition,一个是[/],另一个是虚拟内存[swap].但比较不保险. 稍微麻烦点的方式: / /usr:linux操作系统 /home:使用者信息 /var: ...

  6. 环境配置与JBoss安装-EJB3.0入门经典学习笔记(1)

    目录 1. JDK的安装 2. JBoss的安装 3. JBoss安装目录说明 1. JDK的安装 1) 下载JDK 下载地址:http://www.oracle.com/technetwork/ja ...

  7. PHP fopen和fwrite函数实现创建html页面

    思路 用fopen函数和fread函数得到模板,然后用str_replace函数替换模板标签为变量,最后用fwrite函数输出新的HTML页面 index.html模板页面 <!DOCTYPE ...

  8. linux下gmplayer安装(亲测OK!)

    需要的安装包及下载地址:  mplayer源代码包(MPlayer-1.0rc4.tar.bz2)下载:http://www.mplayerhq.hu/MPlayer/releases/ 解码器安装包 ...

  9. J2SE知识点摘记(十九)

    Collection 1.2.1         常用方法 Collection 接口用于表示任何对象或元素组.想要尽可能以常规方式处理一组元素时,就使用这一接口.Collection 在前面的大图也 ...

  10. jquery判断移动设备代码片段;pc、iphone、安卓

    $(document).ready(function () { /* 判断设备*/ var browser={ versions:function(){ var u = navigator.userA ...