项目需要,有一个树形菜单需要动态生成,联想到TreeView控件,决定用TreeView来实现

 

首先注意到了TreeView控件有一个属性TreeNodeSrc
这个属性可以指定一个固定格式的xml文件

[网络收集]读取XML 利用TreeView控件动态生成无限级树<?xml version="1.0" encoding="utf-8" ?>
[网络收集]读取XML 利用TreeView控件动态生成无限级树
<TREENODES>
[网络收集]读取XML 利用TreeView控件动态生成无限级树    
<TREENODE text="aaaaaaaa" CheckBox="true"></TREENODE>
[网络收集]读取XML 利用TreeView控件动态生成无限级树    
<TREENODE text="bbbbbbbb" CheckBox="true"></TREENODE>
[网络收集]读取XML 利用TreeView控件动态生成无限级树    
<TREENODE text="cccccccccc" EXPANDED="true" CheckBox="true">
[网络收集]读取XML 利用TreeView控件动态生成无限级树        
<TREENODE text="ddddddddd" CheckBox="true"></TREENODE>
[网络收集]读取XML 利用TreeView控件动态生成无限级树        
<TREENODE text="eeeeeeeee" CheckBox="true"></TREENODE>
[网络收集]读取XML 利用TreeView控件动态生成无限级树    
</TREENODE>
[网络收集]读取XML 利用TreeView控件动态生成无限级树    
<TREENODE text="fffffffffffff" CheckBox="true"></TREENODE>
[网络收集]读取XML 利用TreeView控件动态生成无限级树
</TREENODES>
于是就想把数据库里的文件读出来写入一个xml文件中,然后再进行绑定
既然是无限级菜单,肯定要用到递归来实现,于是就写了一个如下的递归算法
[网络收集]读取XML 利用TreeView控件动态生成无限级树private void CreateXml(XmlDocument objXMLDoc, XmlElement objRootElem, int belong)
[网络收集]读取XML 利用TreeView控件动态生成无限级树[网络收集]读取XML 利用TreeView控件动态生成无限级树        
[网络收集]读取XML 利用TreeView控件动态生成无限级树{
[网络收集]读取XML 利用TreeView控件动态生成无限级树            
//Get DataSet 这里的DataSet具体获取方法我省略掉了
[网络收集]读取XML 利用TreeView控件动态生成无限级树
             DataSet ds = new DataSet();
[网络收集]读取XML 利用TreeView控件动态生成无限级树            

[网络收集]读取XML 利用TreeView控件动态生成无限级树            
foreach(DataRow dr in ds.Tables[0].Rows)
[网络收集]读取XML 利用TreeView控件动态生成无限级树[网络收集]读取XML 利用TreeView控件动态生成无限级树            
[网络收集]读取XML 利用TreeView控件动态生成无限级树{
[网络收集]读取XML 利用TreeView控件动态生成无限级树                
//Create ChildNode TreeNode
[网络收集]读取XML 利用TreeView控件动态生成无限级树
                 XmlElement objXmlElem = objXMLDoc.CreateElement("TREENODE");
[网络收集]读取XML 利用TreeView控件动态生成无限级树                 objRootElem.AppendChild(objXmlElem);
[网络收集]读取XML 利用TreeView控件动态生成无限级树
[网络收集]读取XML 利用TreeView控件动态生成无限级树                
//Create Attributes Text
[网络收集]读取XML 利用TreeView控件动态生成无限级树
                 XmlAttribute objXmlAttText = objXMLDoc.CreateAttribute("Text");
[网络收集]读取XML 利用TreeView控件动态生成无限级树                 objXmlAttText.Value
= dr["text"].ToString().Trim();
[网络收集]读取XML 利用TreeView控件动态生成无限级树                 objXmlElem.SetAttributeNode(objXmlAttText);
[网络收集]读取XML 利用TreeView控件动态生成无限级树
[网络收集]读取XML 利用TreeView控件动态生成无限级树                
//Create Attributes CheckBox
[网络收集]读取XML 利用TreeView控件动态生成无限级树
                 XmlAttribute objXmlAttCB = objXMLDoc.CreateAttribute("CheckBox");
[网络收集]读取XML 利用TreeView控件动态生成无限级树                 objXmlAttCB.Value
= "True";
[网络收集]读取XML 利用TreeView控件动态生成无限级树                 objXmlElem.SetAttributeNode(objXmlAttCB);
[网络收集]读取XML 利用TreeView控件动态生成无限级树
[网络收集]读取XML 利用TreeView控件动态生成无限级树                
int id = int.Parse(dr["id"].ToString().Trim());
[网络收集]读取XML 利用TreeView控件动态生成无限级树                 CreateXml(objXMLDoc, objXmlElem, id);
[网络收集]读取XML 利用TreeView控件动态生成无限级树             }

[网络收集]读取XML 利用TreeView控件动态生成无限级树         }

然后用下面的方法来实现绑定
[网络收集]读取XML 利用TreeView控件动态生成无限级树private void BindXmlTree()
[网络收集]读取XML 利用TreeView控件动态生成无限级树[网络收集]读取XML 利用TreeView控件动态生成无限级树        
[网络收集]读取XML 利用TreeView控件动态生成无限级树{
[网络收集]读取XML 利用TreeView控件动态生成无限级树            
//Create Xml File
[网络收集]读取XML 利用TreeView控件动态生成无限级树
             XmlDocument objXmlDoc = new XmlDocument();
[网络收集]读取XML 利用TreeView控件动态生成无限级树
[网络收集]读取XML 利用TreeView控件动态生成无限级树            
//Insert Xml Declaration
[网络收集]读取XML 利用TreeView控件动态生成无限级树
             XmlDeclaration objXmlDeclare = objXmlDoc.CreateXmlDeclaration("1.0", "UTF-8", "yes");
[网络收集]读取XML 利用TreeView控件动态生成无限级树             objXmlDoc.InsertBefore(objXmlDeclare, objXmlDoc.DocumentElement);
[网络收集]读取XML 利用TreeView控件动态生成无限级树
[网络收集]读取XML 利用TreeView控件动态生成无限级树             XmlElement objRootElem
= objXmlDoc.CreateElement("TREENODES");
[网络收集]读取XML 利用TreeView控件动态生成无限级树             objXmlDoc.AppendChild(objRootElem);
[网络收集]读取XML 利用TreeView控件动态生成无限级树
[网络收集]读取XML 利用TreeView控件动态生成无限级树             CreateXml(objXmlDoc, objRootElem,
0);
[网络收集]读取XML 利用TreeView控件动态生成无限级树
[网络收集]读取XML 利用TreeView控件动态生成无限级树             objXmlDoc.Save(
"E:\\TreeMenu.xml");
[网络收集]读取XML 利用TreeView控件动态生成无限级树             TreeView2.TreeNodeSrc
= "TreeMenu.xml";
[网络收集]读取XML 利用TreeView控件动态生成无限级树         }

到最后两行我就停住了,因为问题出现了
生成的objXmlDoc文件不知道用什么方式才能绑定上TreeNodeSrc
我试了试直接 TreeView2.TreeNodeSrc = objXmlDoc;
可是TreeNodeSrc是String型的数据,没办法
有没有什么方法可以不保存这个objXmlDoc文件而直接绑定呢?

于是就换了个办法来实现
TreeView有一个节点控件叫TreeNode,直接把数据给TreeNode上

[网络收集]读取XML 利用TreeView控件动态生成无限级树private void CreateTree(int belong, Microsoft.Web.UI.WebControls.TreeNode rootnode)
[网络收集]读取XML 利用TreeView控件动态生成无限级树[网络收集]读取XML 利用TreeView控件动态生成无限级树        
[网络收集]读取XML 利用TreeView控件动态生成无限级树{
[网络收集]读取XML 利用TreeView控件动态生成无限级树             DataSet ds
= new DataSet();
[网络收集]读取XML 利用TreeView控件动态生成无限级树
[网络收集]读取XML 利用TreeView控件动态生成无限级树            
foreach(DataRow dr in ds.Tables[0].Rows)
[网络收集]读取XML 利用TreeView控件动态生成无限级树[网络收集]读取XML 利用TreeView控件动态生成无限级树            
[网络收集]读取XML 利用TreeView控件动态生成无限级树{
[网络收集]读取XML 利用TreeView控件动态生成无限级树                 Microsoft.Web.UI.WebControls.TreeNode treenode
= new Microsoft.Web.UI.WebControls.TreeNode();
[网络收集]读取XML 利用TreeView控件动态生成无限级树                 treenode.Text
= dr["text"].ToString().Trim();
[网络收集]读取XML 利用TreeView控件动态生成无限级树                 treenode.CheckBox
= true;
[网络收集]读取XML 利用TreeView控件动态生成无限级树                 treenode.Expanded
= true;
[网络收集]读取XML 利用TreeView控件动态生成无限级树                 rootnode.Nodes.Add(treenode);
[网络收集]读取XML 利用TreeView控件动态生成无限级树
[网络收集]读取XML 利用TreeView控件动态生成无限级树                
int id = int.Parse(dr["id"].ToString().Trim());
[网络收集]读取XML 利用TreeView控件动态生成无限级树                 CreateTree(id, treenode);
[网络收集]读取XML 利用TreeView控件动态生成无限级树             }

[网络收集]读取XML 利用TreeView控件动态生成无限级树         }

用的是一样的递归思想,而且我发现这样做还比较简单一些,很多TreeNode自带的属性很方便修改
如果用Xml还要手动去添加每一个属性,麻烦
在PageLoad里触发这个方法
[网络收集]读取XML 利用TreeView控件动态生成无限级树private void Page_Load(object sender, System.EventArgs e)
[网络收集]读取XML 利用TreeView控件动态生成无限级树[网络收集]读取XML 利用TreeView控件动态生成无限级树        
[网络收集]读取XML 利用TreeView控件动态生成无限级树{
[网络收集]读取XML 利用TreeView控件动态生成无限级树             Microsoft.Web.UI.WebControls.TreeNode rootnode
= new Microsoft.Web.UI.WebControls.TreeNode();
[网络收集]读取XML 利用TreeView控件动态生成无限级树             rootnode.Expanded
= true;
[网络收集]读取XML 利用TreeView控件动态生成无限级树             TreeView2.Nodes.Add(rootnode);
[网络收集]读取XML 利用TreeView控件动态生成无限级树             CreateTree(
0, rootnode);
[网络收集]读取XML 利用TreeView控件动态生成无限级树         }
注意,这里为了实现递归,不得不添加一个空的根节点rootnode

 

这样就算大致实现了
另,数据库里的数据格式是这样的
-----------------------------------------
id                     text                     belong
1                     aaaa                     0
2                     bbbb                    0
3                     cccc                     0
4                     dddd                     1
5                     eeee                     2
6                     ffff                         4

摘自:http://hi.baidu.com/tracyjay/blog/item/d0f7275a0e6936212934f054.html

相关文章: