RenderContents 函數
控件的Rander函數調用了“base.Rander”函數,而“base.Rander”函數內部會調用RenderContents函數來輸出控件的內容。因此這裡控件重寫了RenderContents函數用來輸出詳細內容。這個函數是樹狀列表控件C#代碼的主要內容。
本函數的第一個部分就是判斷控件是否處於設計模式,也就是判斷控件是否運行在VS.Net的Web窗體設計器中,其代碼如下
if( base.Page.Site != null )
{
if( base.Page.Site.DesignMode )
{
// 若ASPX頁面是處於設計狀態,比如處於VS.Net集成開發環境的WEB表單設計器
// 中,則本WEB控件不顯示實際內容,只是顯示控件的一些狀態。
Type t = this.GetType();
writer.WriteLine("<b>" + this.ID + "</b>" );
writer.WriteLine("<br />Type=" + t.FullName );
writer.WriteLine("<br />Version=" + t.Assembly.FullName );
writer.WriteLine("<br />GenerateAtServer=" + this.GenerateAtServer );
writer.WriteLine("<br />DynamicLoadChildNodes=" + this.DynamicLoadChildNodes );
writer.WriteLine("<br />AutoScroll=" + this.AutoScroll );
writer.WriteLine("<br />IndentXML=" + this.IndentXML );
writer.WriteLine("<br />Yfyuan release at 2008-2-19");
return ;
}
}
在這裡判斷 base.Page.Site.DesignMode 屬性。若該屬性值為 true , 則表明控件處於設計模式,出現在VS.Net的窗體設計器中。此時控件就是簡單地輸出控件的名稱類型和一些重要屬性值。
若控件不處於設計器中,那就是真正的運行了。若允許客戶端動態加載子節點,則輸出支持動態加載子節點的HTML代碼塊,這裡使用了RegisterStartupscript函數。將在客戶端的form標簽結束前輸出這些Html代碼。
這裡要注意一下,在Render和RenderContents函數中調用RegisterClientscriptBlock函數是無意義的,因為早在任何WEB控件輸出前,form標簽已經開始並輸出了一些內容了,已經輸出的內容是不可更改的,因此Render或RenderContents中不能調用RegisterClientscriptBlock函數,而應當在控件的的OnLoad方法或Load事件處理中調用 RegisterClIEntscriptBlock函數。