最近因为写一个小工具,需要从xml格式配置中读出数据,并动态生成菜单...因为是菜鸟,所以很费了点心思..本来着开放的精神,虽然只是一点小东西,但相信对新手还是有一点点帮助的.现拿出来和大家共享..
1、要求:从xml文件中读出数据,并生成菜单,并在点击菜单时根据相关数据进行处理;
2、例子xml和图片见后。
3、程序代码,及注释:
a)首先,从menuitem派生一个datamenuitem(即包含数据的菜单之意),因为xml源文件里可能有很多数据需要保存,而menuitem没有保存数据的地方
public class datamenuitem:menuitem
{
public string[] attributenames,attributevalues;//保存该菜单的源xml节点中的所有属性名称和值
public string value;//该节点的值(值这种说法可能不太准确,应该是innertext)
public string getattributevaluebyname(string attributename)//为以后的程序取得属性值留的一个方法
{
if(attributenames==null||attributevalues==null)return "";
if(attributenames.length!=attributevalues.length)return "";
int i;
for(i=0;i<attributenames.length;i++)
{
if(attributenames[i]==attributename)return attributevalues[i];
}
return "";
}
}
b)然后是一个把xml数据添加到菜单的方法,详细说明见注释
private void xmltomenu(xmlnode node,menuitem menu)
{
int i;
datamenuitem tempmenuitem=new datamenuitem();
tempmenuitem.index=menu.menuitems.count;//应该可以省略的.
tempmenuitem.text=node.name;
tempmenuitem.value=node.innertext;
if(node.attributes.count>0)//如果有属性,就保存了.没有属性就跳过
{
tempmenuitem.attributenames=new string[node.attributes.count];
tempmenuitem.attributevalues=new string[node.attributes.count];
for(i=0;i<node.attributes.count;i++)
{
tempmenuitem.attributenames[i]=node.attributes[i].name;
tempmenuitem.attributevalues[i]=node.attributes[i].value;
}
}
tempmenuitem.click+= new system.eventhandler(this.datamenu_click);//添加处理click事件的方法,由于datamenuitem是带有数据的,所以这个处理方法可以根据数据的不同来做不同的处理.
menu.menuitems.add(tempmenuitem);
if(node.childnodes.count>1)//因为即使没有子节点,node.childnodes.count也会是1
{
foreach(xmlnode nodes in node.childnodes)
{
xmltomenu(nodes,menu.menuitems[menu.menuitems.count-1]);//递归调用自身
}
}
}
c)处理click事件的方法:
private void datamenu_click(object sender, system.eventargs e)
{
datamenuitem clicked=(datamenuitem)sender;
messagebox.show(clicked.value);//这个只是测试一下,实际中可以根据情况的不同随意取用datamenuitem里的数据;
}
d)最后,只需要调用上面的方法就可以了。提供如下代码供参考,其中有些地方为了看起来更易懂,多花了一些步骤;
menu_xml.menuitems.clear();//menu_xml可自行修改;
int i;
xmldocument xmldoc = new xmldocument();
xmltextreader reader=new xmltextreader("ini.xml");
xmldoc.load(reader);
xmlnodelist nodelist=xmldoc.documentelement.childnodes;
for(i=0;i<nodelist.count;i++)
{
xmlnode node=nodelist[i];
xmltomenu(node,menu_xml);
}
reader.close();
例子xml:ini.xml
<?xml version="1.0" encoding="gb2312" ?>
<test>
<test1>1</test1>
<test2>2</test2>
<test3>3</test3>
<test4>4</test4>
<list>
<test1>1</test1>
<test2>2</test2>
<test3>3</test3>
<list1>
<test1>1</test1>
<test2>2</test2>
</list1>
</list>
</test>
