使用者控件
左直拳
網頁頁面一些經常用到的,邏輯意義上聚內建一塊的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;