C#,读取Xml生成菜单

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 appledotnet 的 blog

最近因为写一个小工具,需要从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>

本文关键:C#,Xml,菜单
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top