建立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。