在這個函數中,首先連接程序目錄下的演示數據庫 SkyDemo.mdb,然後執行一個比較復雜的SQL查詢,獲得數據庫中所有的客戶名稱,訂單信息和訂單貨物信息,然後填充到myTreeVIEw的Nodes屬性中,從而在內存中構造了一個三層的樹狀結構。
這裡面可以看到樹狀列表沒有自動的數據源綁定功能。由於樹狀結構處理過程復雜,簡單的數據源綁定難於實現,因此這個樹狀列表控件不提供數據源綁定功能,而是需要使用者編程向列表添加節點。
填充第一個樹狀列表後,程序然後再次查詢數據庫,獲得所有的客戶名稱和編號,然後填充到myTreeView2 的Nodes中,並設置每個節點的XMLSource屬性。而XMLSource屬性就規定了客戶端動態加載子節點使用的XML文檔的URL地址。這裡使用了另外一個頁面“TreeVIEwNodeXML.ASPx”作為XML文檔的提供者,並向該頁面傳遞參數來決定生成什麼樣的節點定義XML文檔。而且該頁面生成的XML文檔格式符合剛才設計的節點XML文檔格式。
在這個頁面中,沒有任何生成Html代碼的代碼,所做的只是向頁面拖拽放置樹狀列表,然後查詢數據庫填充控件的節點結構,可以說使用比較方便,這個樹狀列表控件內部自動完成了所有的底層工作。
TreeVIEwNodeXML.ASPx
本頁面是一個後台服務頁面,用於向第二個樹狀列表動態的提供子節點信息。該頁面也不復雜,它沒有Html代碼,其ASPX文件只有一行代碼,其代碼如下
<%@ Page language="c#" Inherits="CS_Discovery.TreeViewNodeXml" CodeFile="TreeVIEwNodeXML.ASPx.cs" %>
查看該頁面的C#代碼,只有一個Page_Load函數,其代碼為
protected void Page_Load(object sender, System.EventArgs e)
{
// 關鍵字的類型
string KeyType = this.Request.QueryString["KeyType"] ;
// 關鍵字的數值
string KeyValue = this.Request.QueryString["KeyValue"];
// 設置頁面輸出格式
this.Response.ContentEncoding = System.Text.Encoding.GetEncoding( 936 );
this.Response.ContentType = "text/XML";
// 根據頁面輸出流創建XML文檔書寫器
System.Xml.XmlTextWriter writer = new System.Xml.XMLTextWriter( this.Response.Output );
// 設置帶縮進
writer.IndentChar = ' ' ;
writer.Indentation = 3;
writer.Formatting = System.XML.Formatting.Indented ;
// 開始輸出XML文檔
writer.WriteStartDocument();
writer.WriteStartElement("Nodes");
// 連接數據庫
using( System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection())
{
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
+ this.Server.MapPath("SkyDemo.mdb");
conn.Open();
// 查詢數據庫
using( System.Data.OleDb.OleDbCommand cmd = conn.CreateCommand())
{
if (KeyType == "customerid")
{
// 關鍵字為客戶編號,則此時查詢該客戶編號下的所有的訂單信息
cmd.CommandText = "select orderid , shipname from orders where customerid='"
+ KeyValue +"' order by orderid";
System.Data.IDataReader reader = cmd.ExecuteReader();
while( reader.Read())
{
writer.WriteStartElement("Node");
string NodeID = System.Guid.NewGuid().ToString();
// 創建節點編號
writer.WriteElementString("ID" , NodeID );
writer.WriteElementString("Icon","order.bmp");
// 節點文本就是訂單編號和訂單人姓名
writer.WriteElementString("Text" ,
Convert.ToString( reader.GetValue( 0 ) )
+ "-" + Convert.ToString( reader.GetValue( 1 )));
// 輸出生成子節點使用的XML文檔URL地址,從功能上看相當於遞歸調用本頁面
writer.WriteElementString("XMLSource" ,
"TreeVIEwNodeXML.ASPx?KeyType=orderdetails&KeyValue="
+ Convert.ToString( reader.GetValue( 0 )) );
writer.WriteEndElement();
}
reader.Close();
}
else if( KeyType == "orderdetails" )
{
// 關鍵字為訂單編號,則此時查詢該訂單編號下的所有的貨物的信息
cmd.CommandText = @"
Select
products.productname ,
orderdetails.quantity
from
orderdetails ,
products
where
orderdetails.productid = products.productid
and orderdetails.orderid=" + KeyValue + " order by productname ";
System.Data.IDataReader reader = cmd.ExecuteReader();
while( reader.Read())
{
writer.WriteStartElement("Node");
string NodeID = System.Guid.NewGuid().ToString();
writer.WriteElementString("ID" , NodeID );
writer.WriteElementString("Icon" , "product.bmp" );
writer.WriteElementString("Text" ,
Convert.ToString( reader.GetValue( 0 )));
writer.WriteElementString("OnClick" ,
"alert('" + Convert.ToString( reader.GetValue( 0 )) + "')" );
writer.WriteEndElement();
}
reader.Close();
}
}//using
}//using
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();
}