天天看點

使用者控件

使用者控件

左直拳

網頁頁面一些經常用到的,邏輯意義上聚內建一塊的HTML标簽、控件,甚至包括javascript代碼,可以提煉封裝成使用者控件。

這樣做有很多好處:

1、有利于重用

2、封裝一些代碼,屏蔽一些細節,邏輯清晰,使人能夠更專注大方面的問題

3、控件在設計時隻須用滑鼠拖來拖去,很友善,很爽

4、控件可以應用緩存,使得一些頁面能夠局部緩存,提高了性能

5、……

編寫使用者控件很簡單,我覺得有兩點要注意。

1、控件屬性值容易丢失問題。

通常,一個控件都會有屬性。如,控件userCtrl有屬性Name

private string _Name = “張三”;

public string Name

{

get{ return _Name;}

set{ _Name = value;}

}

由于網頁是無狀态的,重新整理後,如果不在調用頁面對userCtrl.Name進行指派,則Name又重新變回預設值張三了。就是說,使用者控件的屬性值很容易丢失。當然可以任勞任怨,不厭其煩地在調用頁一遍遍地指派,但終究不是好的辦法。

可以将比較重要的屬性改用一些系統控件來儲存,如HTML的hidden控件。象上面的例子,設定一個

<input type=”hidden” id=”txtName” runat=”server” value=”張三”/>

則上面的屬性Name可改為

     get{return txtName.Value;}

     set{txtName.Value = value;};

這樣在頁面生存期間,控件的屬性Name就不會丢失了。不要用ViewState,因為如果調用頁将EnableViewState = false,就不起作用了。

2、在控件裡面加入事件功能。

1)、事件的本質是委托。首先,聲明一個委托:

public delegate void ClickEventHandler(object sender, EventArgs e);

2)、然後用此委托聲明事件:

public event ClickEventHandler SureClick;

3)、編寫事件處理函數

    private void OnSureClick(EventArgs e)

    {

        if (SureClick != null)

        {//執行受委托的方法

            SureClick(this, e);

        }

注意if (SureClick != null) 這句,因為SureClick是個委托(也是事件),如果不為空,也就是受到了委托,即調用頁面将函數或方法賦給了它。這裡這個函數的作用就是去處理調用頁面要執行的函數或方法。

4)、在使用者控件上加個button

<asp:button id=”Button1” style=”display:none” runat=”server”/>

在控件代碼裡,有相應的事件:

    protected void Button1_Click(object sender, EventArgs e)

   {

       ……

       This.OnSureClick(e);//觸發事件處理函數

5)、在調用頁面将待處理的函數或方法賦給SureClick:

<uc2:myCtrl ID="MyCtrl1" runat="server" OnSureClick="待處理的函數或方法名" />

這樣子控件就有了事件支援功能。示例中的事件是點選使用者控件中那個button,調用頁即可得到響應并處理自己要做的事情。

另外,事件參數e的類型可以自己定制。EventArgs是系統給出的類型,如果有需要,也可以換上自己的。比如,可以這樣寫一個e:

public class MyEventArgs : EventArgs

        private int _xID = -1;

        public int xID

        {

            get

            {

                return _xID;

            }

        public MyEventArgs(int nxID) : base()

            _xID = nxID;