看了好多人都寫了用戶控件方面的文章,俺自己也來(lái)一篇總結(jié),這應(yīng)該不算抄襲吧,嘿嘿!!新建一個(gè)用戶控件:
右擊項(xiàng)目添加新項(xiàng),彈出如下圖所示界面,選擇web用戶控件;
為用戶控件添加屬性:01publicstringUserName
02
{
03
get
04
{
05
returntxtUserName.Text;
06
}
07 set
08 {
09 txtUserName.Text = value;
10 }
11
}
編譯之后在客戶端我們就可以訪問(wèn)到這個(gè)UserName屬性,對(duì)其進(jìn)行賦值取值操作,在客戶端的用戶控件屬性一欄看到被公開的UserName屬性:
當(dāng)然我們也可以不以公開屬性的方式與外界交互,我們可以在客戶端通過(guò)FindControl的方式直接操作用戶控件內(nèi)部的控件;
為用戶控件添加事件:
這樣可以在客戶端方便操作:
01
publicpartialclassWebUserControl : System.Web.UI.UserControl
02
{
03
public delegate void submithandler(objectsender,EventArgs e);
04
public eventsubmithandler MySubmitEvent;
05 protectedvoidPage_Load(objectsender, EventArgs e)
06 {
07
08 }
09
publicstringUserName
10
{
11
get
12
{
13
returntxtUserName.Text;
14
}
15
set
16
{
17
txtUserName.Text = value;
18
&
19
}
20 protectedvoidButton1_Click(objectsender, EventArgs e)
21 {
22 if(MySubmitEvent != null)
23
{
24 MySubmitEvent(this, e);
25 }
26 }
27
28 }
首先定義了一個(gè)委托(這里叫submithandler),他有兩個(gè)參數(shù)(也可以不定義參數(shù),參數(shù)可以用于傳遞數(shù)據(jù)),
然后定義了一個(gè)委托變量的事件MySubmitEvent;
最后在當(dāng)前的事件中判斷事件是否被訂閱,如果有訂閱者,則觸發(fā)這個(gè)事件,這個(gè)被公開的事件的訂閱是被放在客戶端的,由客戶端定義事件的回調(diào)函數(shù)(我覺(jué)得叫回調(diào)函數(shù)挺容易理解的,不知道這么叫對(duì)不對(duì)?);
這樣用戶控件的兩個(gè)與外界交互的重要方式就搞定了,在使用用戶控件的時(shí)候還有一個(gè)地方需要注意,就是用戶控件內(nèi)部的控件的ID在客戶端會(huì)解析為用戶控件ID_子控件ID的形式,
所以在用客戶端腳本操作
他們的時(shí)候需要用到一個(gè)重要的屬性ClientID;
01 <%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
02 <asp:LiteralID="Literal1"runat="server">用戶名:</asp:Literal><asp:TextBoxID="txtUserName"runat="server"></asp:TextBox><br/>
03 <asp:LiteralID="Literal2"runat="server">密碼:</asp:Literal><asp:TextBoxID="txtPassWord"runat="server"></asp:TextBox><br/>
04 <asp:ButtonID="Button1"runat="server"Text="獲取用戶名"onclick="Button1_Click"/> 05 <inputid="Button2"type="button"value="input方式獲取用戶名" onclick="ShowName()"/> 06 <scripttype="text/javascript"> 07 function ShowName() { 08 alert(document.getElementById("<%=txtUserName.ClientID%>").value); 09 } 10 </script>
這里txtUserName為用戶控件內(nèi)部的一個(gè)子控件的ID,txtUserName.ClientID是獲取用戶控件在客戶端解析之后的最終ID,而<%=txtUserName.ClientID%>得意思就是在asp.net頁(yè)面執(zhí)行這段服務(wù)器端代碼
當(dāng)然對(duì)于ClientID的重要還表現(xiàn)在模板以及模板控件的使用上;
執(zhí)行之后就輸出在這個(gè)位置供腳本代碼使用;
向客戶頁(yè)面添加用戶控件:
1.打開需要用到用戶控件的頁(yè)面的設(shè)計(jì)界面,直接將用戶控件拖入指定的位置,這樣的話VS會(huì)自動(dòng)的把必要地引用自動(dòng)幫助我們加上,在源碼也拖是沒(méi)有效果哦;
2.就是手動(dòng)的敲出那些引用;
使用用戶控件:
上面我們已經(jīng)為用戶控件公開了屬性和事件,現(xiàn)在我們就在客戶端使用這些東西;
01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 using System.Web; 05 using System.Web.UI; 06 using System.Web.UI.WebControls; 07 08 public partial class _Default : System.Web.UI.Page 09 { 10 protected void Page_Load(object sender, EventArgs e) 11 { 12 13 //WebUserControl1.UserName = "謝龍寶"; 14 TextBox txt=WebUserControl1.FindControl("txtUserName")as TextBox; 15 txt.Text = "謝龍寶"; 16 17 WebUserControl1.MySubmitEvent += new WebUserControl.submithandler(WebUserControl1_MySubmitEvent); 18 } 19 20 void WebUserControl1_MySubmitEvent(object sender, EventArgs e) 21 { 22 23 Response.Write(WebUserControl1.UserName); 24 } 25 26 }
屬性的使用時(shí)很簡(jiǎn)單的,像使用普通的屬性一樣取值呀賦值呀,通過(guò)FindControl的方式直接操作;
至于事件的使用則也水到渠成,上面說(shuō)了事件的訂閱時(shí)放在客戶端的,所以這里我們就在客戶頁(yè)面的加載時(shí)訂閱事件(可以理解為給事件指定了一個(gè)處理函數(shù)(回調(diào)函數(shù)))