利用TreeView控件动态生成无限级树(转)

时间:2021-06-27 12:39:59
项目需要,有一个树形菜单需要动态生成,联想到TreeView控件,决定用TreeView来实现

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

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

利用TreeView控件动态生成无限级树(转)        }

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

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

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

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

利用TreeView控件动态生成无限级树(转)        }

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

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