?? 利用treeview控件動態生成無限級樹.txt
字號:
利用TreeView控件動態生成無限級樹
項目需要,有一個樹形菜單需要動態生成,聯想到TreeView控件,決定用TreeView來實現
首先注意到了TreeView控件有一個屬性TreeNodeSrc
這個屬性可以指定一個固定格式的xml文件
<?xml version="1.0" encoding="utf-8" ?>
<TREENODES>
<TREENODE text="aaaaaaaa" CheckBox="true"></TREENODE>
<TREENODE text="bbbbbbbb" CheckBox="true"></TREENODE>
<TREENODE text="cccccccccc" EXPANDED="true" CheckBox="true">
<TREENODE text="ddddddddd" CheckBox="true"></TREENODE>
<TREENODE text="eeeeeeeee" CheckBox="true"></TREENODE>
</TREENODE>
<TREENODE text="fffffffffffff" CheckBox="true"></TREENODE>
</TREENODES>于是就想把數據庫里的文件讀出來寫入一個xml文件中,然后再進行綁定
既然是無限級菜單,肯定要用到遞歸來實現,于是就寫了一個如下的遞歸算法
private void CreateXml(XmlDocument objXMLDoc, XmlElement objRootElem, int belong)
{
//Get DataSet 這里的DataSet具體獲取方法我省略掉了
DataSet ds = new DataSet();
foreach(DataRow dr in ds.Tables[0].Rows)
{
//Create ChildNode TreeNode
XmlElement objXmlElem = objXMLDoc.CreateElement("TREENODE");
objRootElem.AppendChild(objXmlElem);
//Create Attributes Text
XmlAttribute objXmlAttText = objXMLDoc.CreateAttribute("Text");
objXmlAttText.Value = dr["text"].ToString().Trim();
objXmlElem.SetAttributeNode(objXmlAttText);
//Create Attributes CheckBox
XmlAttribute objXmlAttCB = objXMLDoc.CreateAttribute("CheckBox");
objXmlAttCB.Value = "True";
objXmlElem.SetAttributeNode(objXmlAttCB);
int id = int.Parse(dr["id"].ToString().Trim());
CreateXml(objXMLDoc, objXmlElem, id);
}
}
然后用下面的方法來實現綁定
private void BindXmlTree()
{
//Create Xml File
XmlDocument objXmlDoc = new XmlDocument();
//Insert Xml Declaration
XmlDeclaration objXmlDeclare = objXmlDoc.CreateXmlDeclaration("1.0", "UTF-8", "yes");
objXmlDoc.InsertBefore(objXmlDeclare, objXmlDoc.DocumentElement);
XmlElement objRootElem = objXmlDoc.CreateElement("TREENODES");
objXmlDoc.AppendChild(objRootElem);
CreateXml(objXmlDoc, objRootElem, 0);
objXmlDoc.Save("E:\\TreeMenu.xml");
TreeView2.TreeNodeSrc = "TreeMenu.xml";
}
到最后兩行我就停住了,因為問題出現了
生成的objXmlDoc文件不知道用什么方式才能綁定上TreeNodeSrc
我試了試直接 TreeView2.TreeNodeSrc = objXmlDoc;
可是TreeNodeSrc是String型的數據,沒辦法
有沒有什么方法可以不保存這個objXmlDoc文件而直接綁定呢?
于是就換了個辦法來實現
TreeView有一個節點控件叫TreeNode,直接把數據給TreeNode上
private void CreateTree(int belong, Microsoft.Web.UI.WebControls.TreeNode rootnode)
{
DataSet ds = new DataSet();
foreach(DataRow dr in ds.Tables[0].Rows)
{
Microsoft.Web.UI.WebControls.TreeNode treenode = new Microsoft.Web.UI.WebControls.TreeNode();
treenode.Text = dr["text"].ToString().Trim();
treenode.CheckBox = true;
treenode.Expanded = true;
rootnode.Nodes.Add(treenode);
int id = int.Parse(dr["id"].ToString().Trim());
CreateTree(id, treenode);
}
}
用的是一樣的遞歸思想,而且我發現這樣做還比較簡單一些,很多TreeNode自帶的屬性很方便修改
如果用Xml還要手動去添加每一個屬性,麻煩
在PageLoad里觸發這個方法
private void Page_Load(object sender, System.EventArgs e)
{
Microsoft.Web.UI.WebControls.TreeNode rootnode = new Microsoft.Web.UI.WebControls.TreeNode();
rootnode.Expanded = true;
TreeView2.Nodes.Add(rootnode);
CreateTree(0, rootnode);
}注意,這里為了實現遞歸,不得不添加一個空的根節點rootnode
這樣就算大致實現了
另,數據庫里的數據格式是這樣的
-----------------------------------------
id text belong
1 aaaa 0
2 bbbb 0
3 cccc 0
4 dddd 1
5 eeee 2
6 ffff 4
==========================================
private void InitTree(TreeNodeCollection Nds,string parentId)
{
TreeNode tmpNd;
DataRow[] rows = data.Tables[0].Select("ParentId='" + parentId + "'");
foreach(DataRow row in rows)
{
tmpNd = new TreeNode();
tmpNd.ID = row["NodeId"].ToString();
tmpNd.Text = row["NodeName"].ToString();
tmpNd.NavigateUrl = row["Url"].ToString();
Nds.Add(tmpNd);
if (row["NodeId"].ToString()!="2")
InitTree(tmpNd.Nodes, tmpNd.ID);
}
============================================
# re: 利用TreeView控件動態生成無限級樹 回復
2006-01-27 00:31 by QuickTech
Private Sub LoadTrv()
Dim Root As New Microsoft.Web.UI.WebControls.TreeNode
Root.Text = "ALL:"
Root.ImageUrl = "../images/trv_root.gif"
Root.SelectedImageUrl = "../images/trv_root.gif"
Root.ExpandedImageUrl = "../images/trv_root.gif"
Dim db As New DB
Dim con As SqlClient.SqlConnection = New SqlClient.SqlConnection(db.Constr)
Dim dr As SqlClient.SqlDataReader
Dim SQL As String = "select Floor_value,Floor_Title from basic_floor order by floor_value"
Dim cmd As SqlClient.SqlCommand = New SqlClient.SqlCommand(SQL, con)
con.Open()
dr = cmd.ExecuteReader
While dr.Read
Dim FloorNd As New Microsoft.Web.UI.WebControls.TreeNode
FloorNd.Text = dr("Floor_value") & ":" & dr("Floor_Title")
FloorNd.ImageUrl = "../images/TrvST2.bmp"
FloorNd.SelectedImageUrl = "../images/trvst10.bmp"
FloorNd.ExpandedImageUrl = "../images/trvst1.bmp"
Root.Nodes.Add(FloorNd)
End While
dr.Close()
con.Close()
con.Dispose()
cmd.Dispose()
End Sub
為什么我的代碼不能顯示呢?????????
# re: 利用TreeView控件動態生成無限級樹 回復
2006-01-27 00:34 by QuickTech
對不起
我的根都沒加
問題解決了
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -