Net 中,可以很方便地使用由微軟提供的 Internet Exploer Web Controls 控件來實現樹形列表。由微軟提供的這套控件集合中包括有 MultiPage,TabStrip,Toolbar,TreevIEw 四個控件。
關於這幾個控件的使用在微軟的網站由詳細的說明(參見:http://www.microsoft.com/china/msdn/archives/library/dnASPp/Html/aspnet-usingtreeviewiewebcontrol.asp; http://msdn.microsoft.com/library/default.asp?url=/workshop/webcontrols/overview/overvIEw.ASP)。
在微軟提供的文檔中 Treeview 控件支持 XML 文件作為資源文件(XML 文件的結構本來就是一種樹型結構),關於在 TreevIEw 控件中如可使用 XML 文件,很多資料有詳細的介紹(http://www.yesky.com/SoftChannel/72342380468043776/20040630/1825811.sHtml),本文介紹的則是用另外一種方式解析 XML 文件到 TreevIEw 控件中。
因為該方法是我在沒有找到資料的情況下為了方便使用該控件而自行寫的一個處理過程,其實在使用的時候已經大不可必,寫出來,只是出於共同學習的目的。
在拿到這個控件的時候,我對其使用方法是不大了解的,但為了讓自己在以後的程序中能夠較為方便的使用之,所以我決定采用使用 XML 文件的方式以存儲節點信息,所以首先我構建了一個 XML 文件基本格式:
<?XML version="1.0" encoding="UTF-8"?>
<treevIEw>
<nodes>
<text>根節點</text>
<link></link>
<target>_self</target>
<description></description>
<node>
<text>測試節點 -1</text>
<link>/test1.ASPx</link>
<target>MainFrame</target>
<description></description>
</node>
<node>
<text>測試節點 - 2</text>
<link>/test2.ASPx</link>
<target>_top</target>
<description></description>
</node>
</nodes>
</treevIEw>
treevIEw 為根結點,nodes 為父級節點,node 為子節點。其中 nodes 可以嵌套,可以並行,node 只能並行。在定義好結構後,最主要的就是如何解析了。下面是具體的代碼:
///
/// TreeViewParse TreeVIEw解析器,從XML文件中讀取節點值
/// document XML文檔
/// treeView Microsoft.Web.UI.WebControls.TreeVIEw
///
private void TreeVIEwParse(System.Xml.XMLNode document, Microsoft.Web.UI.WebControls.TreeView treeVIEw)
{
if(document.Name != "treevIEw") return;
foreach(System.Xml.XMLNode node in document.ChildNodes)
{
if(node.Name != "nodes") return;
this.NodesParse(node, treeVIEw, null);
}
}
///
/// NodesParse Nodes解析器,從XML文件中讀取主節點值
/// document XML文檔
/// treeView Microsoft.Web.UI.WebControls.TreeVIEw
/// treeNode 父級節點
///
private void NodesParse(System.Xml.XMLNode document, Microsoft.Web.UI.WebControls.TreeView treeVIEw, Microsoft.Web.UI.WebControls.TreeNode treeNode)
{
if(document.Name != "nodes") return;
Microsoft.Web.UI.WebControls.TreeNode child = new Microsoft.Web.UI.WebControls.TreeNode();
foreach(System.Xml.XMLNode node in document.ChildNodes)
{
string name = (node.Name != null ? node.Name : "");
// child.ID = node.Name + "_" + treeVIEw.Nodes.Count.ToString();
switch(name.Trim().ToLower())
{
case "text":
child.Text = node.InnerText;
break;
case "link":
child.NavigateUrl = node.InnerText;
break;
case "target":
child.Target = node.InnerText;
break;
case "nodes":
NodesParse(node, treeVIEw, child);
break;
case "node":
NodeParse(node, treeVIEw, child);
break;
}
}
if(treeNode == null) treeVIEw.Nodes.Add(child);
else treeNode.Nodes.Add(child);
}
///
/// NodeParse Node解析器,從XML文件中讀取子節點值
/// document XML文檔
/// treeView Microsoft.Web.UI.WebControls.TreeVIEw
/// treeNode 父級節點
///
private void NodeParse(System.Xml.XMLNode document, Microsoft.Web.UI.WebControls.TreeView treeVIEw, Microsoft.Web.UI.WebControls.TreeNode treeNode)
{
Microsoft.Web.UI.WebControls.TreeNode child = new Microsoft.Web.UI.WebControls.TreeNode();
foreach(System.Xml.XMLNode node in document.ChildNodes)
{
string name = (node.Name != null ? node.Name : "");
switch(name.Trim().ToLower())
{
case "text":
child.Text = node.InnerText;
break;
case "link":
child.NavigateUrl = node.InnerText;
break;
case "target":
child.Target = node.InnerText;
break;
case "nodes":
NodesParse(node, treeVIEw, child);
break;
}
}
treeNode.Nodes.Add(child);
}
以下是使用方法:
private Microsoft.Web.UI.WebControls.TreeView MSTreeView = new Microsoft.Web.UI.WebControls.TreeVIEw();
System.Xml.XmlDocument document = new System.Xml.XMLDocument(); //
document.Load(System.Web.HttpContext.Current.Server.MapPath(this.XMLDocument));
MSTreeVIEw.Nodes.Clear();
TreeViewParse(document.DocumentElement, MSTreeVIEw);
到此,基本結束,此時就可以在頁面正確顯示自行定義的 XML 文檔的樹目錄,但我還不認為方便,於是將其綜合後寫成了一個組件,於是在使用的時候只需拖放到頁面上……但後來在找資料的時候找到了其實 TreevIEw 控件本身就可以直接使用 XML 文檔(http://www.yesky.com/SoftChannel/72342380468043776/20040630/182
5811.sHtml)。所以,這個方法就只能是一段用以學習的代碼了!