在自定義用戶控件中,我們經常要添加自定義的事件,這時就要使用到委托(delegate)了。
在做開發中,經常都要用到登錄。那麼,我們就把登錄的界面做成一個控件,以後再使用它就方便多了。
登錄界面很簡單,隨便做做的,它有一個“登錄”的按鈕。我們需要當點擊“登錄”按鈕時,它能執行我們在其它頁面定義的登錄操作,這時就需要用到委托了,把登錄操作委托給“登錄”按鈕來執行。下面是用戶控件的後台代碼:
Code
public partial class WebUserControl : System.Web.UI.UserControl
{
public event EventHandler LoginClick;
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
LoginClick(sender, e);
}
}
事件使用關鍵字event修飾,它的類型是委托類的。在APS.NET的頁面上,我們就可以為事件添加方法了:
Code
<uc1:WebUserControl ID="WebUserControl1" runat="server" OnLoginClick="Login_Click" /></div>
Code
protected void Login_Click(object sender, EventArgs e)
{
Response.Write("<script>alert('Logined')</script>");
}
運行結果如圖:
但是這樣還不夠,我們需要獲取用戶輸入的用戶名和密碼,其中比較好的一種做法是自定義擴展EventArgs類:
Code
public class LoginEventArgs : EventArgs
{
private string userName;
public string UserName
{
get { return userName; }
set { userName = value; }
}
private string password;
public string Password
{
get { return password; }
set { password = value; }
}
}
定義一個登錄委托類:
Code
public delegate void LoginEventHandler(object sender, LoginEventArgs e);
修改一下剛才的代碼:
Code
public partial class WebUserControl : System.Web.UI.UserControl
{
public event LoginEventHandler LoginClick;
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
LoginEventArgs loginE = new LoginEventArgs();
loginE.UserName = TextBox1.Text;
loginE.Password = TextBox2.Text;
LoginClick(sender, loginE);
}
}
Code
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Login_Click(object sender, LoginEventArgs e)
{
Response.Write("<script>alert('UserName:"+e.UserName+",Password:"+e.Password+"')</script>");
}
}
運行結果如圖: