OnLoad 函數
控件重寫了WebControl的OnLoad函數,其代碼為
/// <summary>
/// 控件加載時的處理,此時控件尚未向頁面輸出Html代碼。
/// </summary>
/// <param name="e">事件參數</param>
protected override void OnLoad(EventArgs e)
{
base.OnLoad (e);
// 包含樹狀列表節點樣式的Html代碼
string strStyleHtml = "\r\n.SkyTreeVIEwControl_TreeNode { " + this.TreeNodeStyleString + "}"
+ "\r\n.SkyTreeVIEwControl_SelectedNode{" + this.SelectedNodeStyleString + "}\r\n";
// 添加樹狀節點使用的CSS樣式代碼
if (this.Page.Header != null)
{
// 若在ASPX的Html代碼中使用了“<head runat=server>.</head>”則
// this.Page.Header屬性有效,可以向head標簽下添加新內容。
// 按照比較嚴格的Html規范,style標簽只能放置在head標簽下面。
// ASP.NET2.0支持this.Page.Header屬性,但ASP.Net1.0/1.1不支持。
bool find = false;
foreach (System.Web.UI.Control ctl in this.Page.Header.Controls)
{
// 搜索Header下面的所有的子元素,看看是否已經輸出過樹狀列表
// 節點樣式元素。
if (ctl.ID == "SkyTreeVIEwControl_Style")
{
find = true;
break;
}
}
if (find == false)
{
// 若以前沒有輸出則向Header元素下添加新的style元素,並設置其內容。
HtmlGenericControl style = new HtmlGenericControl("style");
style.ID = "SkyTreeVIEwControl_Style";
style.InnerHtml = strStyleHtml;
this.Page.Header.Controls.Add(style);
}
}
else
{
// 不能在Render或RenderContents函數中使用RegisterClIEntscriptBlock
// 因為那時RegisterClIEntscriptBlock函數的功能已經不在狀態,無效了。
// 而OnLoad函數中頁面尚未開始輸出,此時RegisterClIEntscriptBlock函數
// 是有效的。
this.Page.Clientscript.RegisterClIEntscriptBlock(
this.GetType(),
"SkyTreeVIEwControl_Style",
"<style>" + strStyleHtml + "</style>");
}
}
這裡的樹狀節點列表需要根據其選擇狀態而使用屬性“TreeNodeStyleString”或 “SelectedNodeStyleString”中指定的CSS樣式,為了減少HTML代碼量,將生成一個style的Html標簽,該標簽包含了屬性“TreeNodeStyleString”或“SelectedNodeStyleString”指定的CSS樣式,而對樹狀列表節點采用 “class=’樣式名稱’”來選擇其CSS顯示樣式。