asp.net|編程|伺服器|控制項 建立Asp.net裡的伺服器控制項和Windows Form的控制項一樣,也有幾種方式:
1、 使用者控制項(user control)
2、 從Control、WebControl派生的自訂控制項
3、 從已有的Asp.net伺服器控制項擴充
使用者控制項以.ascx為副檔名,並儲存為文字檔,使用者控制項不像從Control和WebControl派生下來的伺服器控制項那樣需要先行編譯,當使用者控制項在.aspx頁面中使用的時候,頁面解析器從.aspx檔案中動態地產生一個類,並且將其編譯到一個裝配件中。其優點有:解決了代碼複用,同時每一個使用者控制項有自己的物件模型,其編寫語言和.aspx頁面的語言無關。
從已有的Asp.net伺服器控制項擴充,主要是對.net原生的伺服器控制項的功能加強以適用我們開發和終端使用者的需要。
從Control、WebControl派生的自訂控制項以編譯過的類庫形式部署的。
上述的1和3在本系列中將不做講解,在本系列中只講解從Control、WebControl派生的伺服器控制項。
我們要編寫一個自訂控制項,只要從Control、WebControl繼承即可,Control已經實現了IComponent介面,而WebControl本身又是從Control上派生下來的,因而他們也支援組件的可視化設計。
Render方法和HtmlTextWriter類,當我們從一個Control類派生一個Asp.net伺服器控制項時,Control類為我們提供了可重載的Render和一個HtmlTextWriter類型的執行個體,Render方法就是將伺服器控制項內容發送到提供的 HtmlTextWriter 對象,而HtmlTextWriter封裝了HTML寫文字資料流的功能函數。
using System;
using System.Collections.Generic;
using System.Text;
namespace ClassLibrary1
{
public class Control1 : System.Web.UI.Control
{
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
writer.Write("I'm here.");
}
}
public class Control2 : System.Web.UI.WebControls.WebControl
{
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
writer.Write("I'm here too.");
}
}
}
上面的代碼裡我們定義了一個Contro1和Control2,他們分別從Control和WebControl繼承下來,那他們之間到底有什麼樣的本質區別呢?先看下面的效果:
從上面的效果我們不難看出他們之間有什麼區別,WebControl類通過屬性提供了對樣式的支援,比如字型、高度、背景色等等。那我們什麼時候來選擇從Control派生,什麼時候又選擇從WebControl派生呢?如果控制項要產生非可視化的元素或顯示給非HTML用戶端,就從Control派生,如SqlDataSource;如果要提供用戶端產生可視化的HTML,那我們就從WebControl派生,如TextBox。