文章目錄
- 使用者控制項頁面代碼
- 事件參數代碼
- 控制項的後置代碼
- 調用頁面
- 後置代碼
- 運行效果
- Interit
- Static
- AutoID
既然使用者控制項可以有自己的方法和屬性,同樣也可以自己的事件。通過方法和屬性,使用者控制項響應網頁代碼的變化。然而使用事件時,剛好與方法和屬性相反,使用者控制項通知網頁發生了某些活動,然後由網頁代碼做出響應
有時候,給使用者控制項添加一個事件可以解決大難題。例如,登陸使用者控制項,就可以給它添加一個自己的提交事件,這樣提交的時候就可以方便的擷取回傳的值,如使用者名稱和密碼等資訊(viewstate)。當然給使用者控制項添加事件也不是那麼麻煩。一般情況下,可以在使用者控制項檔案中定義一個事件,然後再宿首頁面(aspx)中來訂閱這個事件。當按鈕被單擊並提交資料時,產生事件,發布通知,這樣宿首頁面就可以受到資訊並處理這個事件。
下面我們就來示範一下
使用者控制項頁面代碼
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="LoginControl.ascx.cs" Inherits="ASPNETTeach4.LoginControl" %>
使用者名稱:<asp:TextBox ID="txtLoginName" runat="server"></asp:TextBox>
密碼:<asp:TextBox ID="txtLoginPwd" runat="server" TextMode="Password"></asp:TextBox>
<asp:Button ID="btnLogin" runat="server" Text="Button" OnClick="btnLogin_Click" />
設計好頁面後,接下來需要建立自訂對象LoginEventControlArgs類,並在該類中添加一個EventMessage屬性。該屬性是一個唯讀屬性,用來返回相關的使用者名稱和密碼資訊等。
事件參數代碼
public class LoginEventControlArgs:EventArgs
{
public string LoginName { get; set; }
public string LoginPwd { get; set; }
public string EventMessage {
get {
return DateTime.Now.ToString() +
"帳號:" + LoginName +
"---密碼:" + LoginPwd;
}
}
}
定義好自訂事件參數後,我們還需要事件簽名的委託。可以將該委託加在任何你喜歡的地方,一般情況下放在同一個命名空間下。
public delegate void LoginEventControlHandler(object sender,LoginEventControlArgs);
控制項的後置代碼
public partial class LoginControl : System.Web.UI.UserControl
{
//定義事件
public event LoginEventControlHandler LoginEvent;
protected void Page_Load(object sender, EventArgs e)
{
}
protected void btnLogin_Click(object sender, EventArgs e)
{
if (LoginEvent != null) {
LoginEventControlArgs args = new LoginEventControlArgs();
args.LoginName = txtLoginName.Text;
args.LoginPwd = txtLoginPwd.Text;
LoginEvent(this, args);
}
}
}
現在我們一個自訂事件的方法就完成了。下面我們來用頁面使用一下
調用頁面
<body>
<form id="form1" runat="server">
<div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<uc1:LoginControl runat="server" OnLoginEvent="LoginControl_LoginEvent" id="LoginControl" />
</div>
</form>
</body>
後置代碼
protected void LoginControl_LoginEvent(object sender,LoginEventControlArgs args)
{
if (args.LoginName == "admin" && args.LoginPwd == "123") {
this.Label1.Text = "登陸成功";
}
}
運行效果
以編程的方式動態載入使用者控制項
在實際開發中經常遇見這種情況,要求系統根據某種條件來動態載入相關的使用者控制項。
protected void Page_Load(object sender, EventArgs e)
{
LoginControl c = Page.LoadControl("~/LoginControl.ascx") as LoginControl;
PlaceHolder1.Controls.Add(c);
c.LoginEvent += LoginControl_LoginEvent;
}
protected void LoginControl_LoginEvent(object sender,LoginEventControlArgs args)
{
if (args.LoginName == "admin" && args.LoginPwd == "123") {
this.Label1.Text = "登陸成功";
}
}
我們看到和winform的動態添加控制項的方式基本一致。
但是產生的原始碼中我們發現控制項ID和我們ASP上的ID不一致了。
我們有時候需要控制js如果產生這種ID的話JS編寫導致一些錯誤。那麼我們可以這麼做
<script type="text/javascript">
alert(<%= Label1.ClientID%>.innerHTML);
</script>
顯示效果:
ClientIDMode屬性
我們除了上面這種硬式編碼方式,當然還有更優雅的方式。
ASPNET給我們提供了3個產生的ID的方式
Interit
預設情況下,頁面上所有控制項都使用值為Inherit的ClientIDMode,它表示控制項將適用於其父控制項相同的ClientIDMode,即這個值指定控制項像它的父控制項一樣產生ID。
Static
使用控制項原始的命名方式
AutoID
採用預設的3.5產生的方式
後面我們進入第二部分 ASP.NET資料訪問