C 封裝控制項 學習(4)

2021-06-06 11:02:59 字數 4397 閱讀 7746

復合控制項

概念:所謂復合控制項:簡單的理解就是將多個基本的控制項組合成乙個控制項,從而實現自己想要的效果。微軟為asp.net2.0中推出的登入控制項等就是乙個復合控制項。從功能的實現上,複合式控制項有點像使用者控制項,只是乙個是.ascx檔案,乙個是.dll檔案。

呈現簡單的復合控制項:

要想呈現乙個復合控制項,需要了解以下幾個方面:

-->實現inamingcontainer

介面。任何實現該介面的控制項都建立乙個新的命名空間,在這個新的命名空間中,所有子控制項 id 屬性在整個應用程式內保證是唯一的。

-->control.createchildcontrols 方法。

由 asp.net 頁面

框架呼叫,以通知使用基於合成的實現的伺服器控制項建立它們包含的任何子控制項,以便為回發或呈現做準備。 當開發復合伺服器控制項或

模板伺服器控制項時,必須重寫此方法。重寫 createchildcontrols 方法的控制項應實現 inamingcontainer 介面以避免命名衝突。

-->control.childcontrolscreated 屬性。

獲取乙個值,該值指示是否已建立伺服器控制項的子控制項。

-->control.ensurechildcontrols 方法。

確定伺服器控制項是否包含子控制項。如果不包含,則建立子控制項。

下面就通過例項來呈現個簡單的復合登陸控制項:建立asp.net伺服器控制項工程。complexcontrol。

先來看**:

namespace complexcontrol

:logincontrol runat=server buttontext='登入' namelabel='使用者名稱:' passwordlabel='使用者密碼:'>")]

public class logincontrol : webcontrol, inamingcontainer

set}

[bindable(true),category("default"),defaultvalue(""),description("姓名")]

public string name

set}

public string nameerrormessage

set}

public string namelabel

set}

[browsable(false),designerserializationvisibility(designerserializationvisibility.hidden)]

public string password

}public string passworderrormessage

set}

public string passwordlabel

set}

protected override void createchildcontrols()

protected override void render(htmltextwriter writer)}}

首先我們例項化了幾個現有控制項的物件。然後宣告了一大堆的屬性,要注意的:和平時定義屬性不同,我們在每乙個屬性中都新增了ensurechildcontrols ()方法。其他的沒有任何變化,和一般的屬性宣告一樣。

接下來我們從寫了重要的createchildcontrols()。將前面宣告好的例項化控制項物件新增到controlcollection中。融合成乙個控制項。

最後重寫控制項顯示的render()方法。生成登入窗體的樣式。效果如下:

這樣,我們基本上就完成了復合控制項的基本顯示功能。

復合控制項的事件處理:

由於復合控制項中包含子控制項,這就使得復合控制項的事件處理變得複雜起來。由於不允許開發人員直接訪問子控制項,如果子控制項的事件不能作為頂級事件引發,那麼將無法實現子控制項的事件處理。

我們可以以兩種形式來完成事件的處理:一是直接將事件封裝到控制項中,顯然靈活性很差。二就是自定義事件,使用者來完成事件的**。

第一種情況比較簡單:就是在建立我們得控制項時,將要實現的效果直接封裝在dll中。這裡就不做說明了。

但是往往控制項觸發時,我們想做自己的事情,這就是第二種情況的事件處理。這就需要把事件交給主控件,由主控件統一暴露事件,這樣開發人員在使用控制項時僅需要為主控制項註冊事件即可,剩下的由主控件負責引發子控制項的事件或執行子控制項的某些功能,這裡就涉及主控件與其子控制項的事件銜接問題,復合控制項的這種事件處理,主要是實現子控制項事件上傳的過程。一般分為:包含法和冒泡法兩種處理方式。

-->包含法:

基本思想是:通過在子控制項的事件處理程式中呼叫復合控制項的頂層事件處理程式,以完成子控制項的事件上傳。 在createchildcontrols方法中,為子控制項新增事件處理程式。

接著上面登陸控制項的例子,來實現下登入按鈕的事件。

首先在createchildcontrols()中,為_button新增單擊事件。(其他**略)

_button = new button();

_button.id = "button1";

_button.click += new eventhandler(_button_click);

然後建立主控件對外的處理函式:

void _button_click(object source, eventargs e)

private static readonly object eventclicklogin = new object();

public event eventhandler clicklogin

remove

}protected virtual void onclicklogin(eventargs e)

}public void raisepostbackevent(string eventargument)//處理回發事件

void _button_click(object source, eventargs e)

這樣,我們就實現了第一種方法。測試一下:

protected void logincontrol1_clicklogin1(object sender, eventargs e)

單擊按鈕,將觸發上面的事件。

-->冒泡法:

基本思想:使用asp.net 2.0框架提供的事件上傳機制。這種機制允許子控制項將事件沿其包容層次結構向上傳播到合適的位置引發,並且允許將事件處理程式附加到原始控制項以及公開冒泡的事件的控制項上。

冒泡法的實現,使用control基類中專門用於事件上傳的兩個方法:onbubbleevent和raisebubbleevent。onbubbleevent方法用於確定子控制項的事件是否沿復合控制項層次結構向上傳遞。在該方法中,引數source表示事件源,引數args表示包含事件資料的eventargs物件。如果子控制項的事件向上傳遞,則為true;否則為false。預設值為false。raisebubbleevent方法用於將所有事件源及其資訊分配給控制項的父級,並且不能被重寫。儘管無法重寫此方法,但創作的控制項可以通過重寫 onbubbleevent 方法處理或引發冒泡事件。

還是通過例子說明一下:

首先在createchildcontrols()中宣告commandname屬性。

_button.commandname = "clicklogin";

然後定義事件:

private static readonly object eventclicklogin = new object();

public event eventhandler clicklogin

remove

}protected virtual void onclicklogin(eventargs e)

}protected override bool onbubbleevent(object source, eventargs e)

}return handled;

}public void raisepostbackevent(string eventargument)//處理回發事件

這裡主要要注意的是:onbubbleevent()的使用。通過commandname的值,來相應的找到處理事件的控制項。

測試一下:

protected void logincontrol1_clicklogin1(object sender, eventargs e)

單擊按鈕,將觸發上面的事件。

封裝控制項 學習(1) C

在我們的專案開發中,由於asp.net的伺服器控制項功能有限,所以我們經常會自己定義特定的伺服器控制項,來滿足開發中特定的業務要求。可見知道如何開發asp.net伺服器控制項是非常有必要的。其實簡單的實現asp.net伺服器控制項不是很難,以前園子中也有大牛介紹過相應的內容,這裡站在巨人的肩膀上也來...

C 學習記錄 (4)類和物件 封裝

下面就是c 對於c的不同 物件導向程式設計。封裝就是把屬性和行為作為乙個整體,並加以許可權控制。訪問許可權有 public protected private 1 public 類內和類外都可以訪問。2 protected 類內可以訪問 內外不能訪問。繼承後,子類可以訪問父類的protected。3...

封裝TeeChart控制項

public class mychart 封裝的類中包含乙個tchart型別的私有變數 如果需要對tchart私有變數操作的話,就可以封裝方法或者屬性來實現。封裝之後,如果在賦值的時候,希望自動轉換 可以通過型別的隱式轉換來實現 自定義的類zbmaxis封裝了axis,包含乙個私有變數axis ax...