這段代碼中,首先調用函數ReadXSLTString從資源文件“SkyTreeVIEwControl.xslt”加載一個XML文檔,然後創建一個NodeXmlDocument變量,調用它的LoadXml函數對根節點進行XML序列化所得的XML字符串來生成XML文檔,然後創建一個 System.XML.Xsl.XslCompiledTransform類型的XSLT轉換引擎,調用它的Load方法加載XSLT模板,調用它的 Transform方法來執行XSLT轉換,轉換結果輸出到myStrWriter的字符串書寫器中,這個字符串書寫器中的內容就是用於顯示樹狀結構的 HTML代碼。然後程序使用RenderContent函數的writer參數將這個Html代碼輸出到頁面中。
若不是在服務器端生成HTML代碼,那就是在客戶端生成代碼了,於是程序輸出一個XML數據島的Html代碼,該數據島的內容就是節點XML文檔的內容。實現這個功能的C#代碼為
// 若在客戶端動態生成Html代碼則將數據XML字符串輸出到ASPX頁面中
writer.Write("<span id='" + this.ClIEntID + "_container' >正在加載,請稍候</span>");
// 將數據XML字符串輸出到ASPX頁面中的一個XML數據島中
writer.Write("<xml id='" + this.ClIEntID + "_xml'>" + xml + "</XML>");
// 輸出將要初始化樹狀列表的Javascript函數
this.Page.ClIEntscript.RegisterStartupscript(
this.GetType() ,
"SkyTreeViewControL_Init_" + this.ClIEntID , @"
<script language=Javascript>
RefreshSkyTreeViewControl( '" + this.ClIEntID + @"' );
< /script>
");
這裡調用了RegisterStartupscript函數,使得HTML頁面加載時立即調用名為 RefreshSkeyTreeVIEwControl 的Javascript函數來初始化這個樹狀列表,本控件輸出的第二段Html代碼就包含了該Javascript函數。
操作數據視圖
本WEB控件還在數據視圖中保存數據,其功能代碼為
/// <summary>
/// 保存數據視圖狀態
/// </summary>
/// <returns>操作結果</returns>
protected override object SaveVIEwState()
{
this.VIEwState["nodes"] = this.myNodes ;
return base.SaveVIEwState ();
}
/// <summary>
/// 加載數據視圖狀態
/// </summary>
/// <param name="savedState">操作結果</param>
protected override void LoadVIEwState(object savedState)
{
myNodes = this.VIEwState["nodes"] as SkyTreeNodeList ;
base.LoadVIEwState (savedState);
}