在菜单项经常需要更新的情况下,使用XML文件作为数据库来存储记录是非常有用的。例如,当菜单项需要频繁更新时,可以通过XML文件来实现。本文将提供一个简单的例子,以帮助理解如何实现这一功能。
要理解以下步骤,需要具备XML、TreeView控件以及Visual Studio的基础知识。
注意:附带的解决方案文件(xml2treeviewmenuSolution)是使用VS2010创建的。
将一个XML文件添加到项目中,并命名为"menu.xml"。编辑XML文件,添加菜单项。
        <?xml version="1.0" encoding="utf-8"?>
        <root>
            <folder title='folder 1a'>
                <record title='record 1a1'/>
                <record title='record 1a2'/>
            </folder>
            <folder title='folder 1b'>
                <record title='record 1b1'/>
            </folder>
            <folder title='folder 2a'>
                <record title='record 2a1'/>
            </folder>
            <folder title='folder 3a'>
                <record title='record 3a1'/>
                <record title='record 3a2'/>
            </folder>
        </root>
    
从Visual Studio工具箱中拖动TreeView控件到Windows表单上。在这个例子中,将控件命名为"treeViewMenu"。
        using System.Xml;
        using System.Xml.XPath;
    
        public partial class Form1 : Form
        {
            private XmlDocument docXML = new XmlDocument();
        }
    
当窗体加载时,加载XML文档,并开始填充TreeView控件。
        private void Form1_Load(object sender, EventArgs e)
        {
            docXML.Load("menu.xml");
            populateBaseNodes();
        }
    
填充从第一级<folder>节点开始。在每个基础节点添加到树中之后,为其添加子节点。
        private void populateBaseNodes()
        {
            treeViewMenu.Nodes.Clear();
            treeViewMenu.BeginUpdate();
            TreeNode treenode;
            treenode = treeViewMenu.Nodes.Add("Folders");
            XmlNodeList baseNodeList = docXML.SelectNodes("root/folder");
            foreach (XmlNode xmlnode in baseNodeList)
            {
                string title = xmlnode.Attributes["title"].Value;
                treenode = treeViewMenu.Nodes.Add(title);
                populateChildNodes(xmlnode, treenode);
            }
            treeViewMenu.EndUpdate();
            treeViewMenu.Refresh();
        }
    
每个子节点将被检查是否有进一步的子节点。对于找到的每个子节点,循环将被调用。
        private void populateChildNodes(XmlNode oldXmlnode, TreeNode oldTreenode)
        {
            TreeNode treenode = null;
            XmlNodeList childNodeList = oldXmlnode.ChildNodes;
            foreach (XmlNode xmlnode in childNodeList)
            {
                string title = xmlnode.Attributes["title"].Value;
                treenode = oldTreenode.Nodes.Add(title);
                populateChildNodes(xmlnode, treenode);
            }
        }