風影ASP.NET基礎教學 8使用者控制項編程之自訂事件

來源:互聯網
上載者:User
文章目錄
  • 使用者控制項頁面代碼
  • 事件參數代碼
  • 控制項的後置代碼
  • 調用頁面
  • 後置代碼
  • 運行效果
  • 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資料訪問

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.