首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 委托在自定義用戶控件中的事件傳遞實戰

     編輯:關於C#

為什麼自定義控件需要委托?

封裝登錄、查詢等通用界面為用戶控件時,控件內部按鈕點擊後的具體業務邏輯(如驗證帳號、寫入日誌)由宿主頁面決定。委托讓控件「不關心具體做什麼,只負責通知發生了什麼」,實現控件與業務邏輯解耦。

基礎版:單純事件通知

用戶控件後台代碼

public partial class LoginControl : System.Web.UI.UserControl
{
    // 定義事件,類型為 EventHandler
    public event EventHandler LoginClick;

    protected void Page_Load(object sender, EventArgs e) { }

    protected void btnLogin_Click(object sender, EventArgs e)
    {
        // 觸發事件,通知訂閱者
        LoginClick?.Invoke(sender, e);
    }
}

宿主頁面訂閱事件

<uc1:LoginControl ID="LoginControl1" runat="server" OnLoginClick="Login_Click" />

protected void Login_Click(object sender, EventArgs e)
{
    Response.Write("<script>alert('Logined')</script>");
}

進階版:攜帶數據的自定義事件參數

實際場景常需獲取用戶輸入的帳號密碼,需自定義 EventArgs。

1. 定義強類型事件參數

public class LoginEventArgs : EventArgs
{
    public string UserName { get; set; }
    public string Password { get; set; }
}

2. 定義強類型委托

public delegate void LoginEventHandler(object sender, LoginEventArgs e);

3. 控件內部封裝並觸發

public partial class LoginControl : System.Web.UI.UserControl
{
    public event LoginEventHandler LoginClick;

    protected void btnLogin_Click(object sender, EventArgs e)
    {
        var args = new LoginEventArgs 
        { 
            UserName = txtUserName.Text, 
            Password = txtPassword.Text 
        };
        LoginClick?.Invoke(this, args);
    }
}

4. 宿主頁面接收強類型參數

protected void Login_Click(object sender, LoginEventArgs e)
{
    Response.Write($"<script>alert('UserName:{e.UserName}, Password:{e.Password}')</script>");
}

關鍵點總結

層級做法優勢
基礎用 EventHandler + EventArgs簡單、無數據傳遞場景
進階自定義 EventArgs + 強類型委托類型安全、IntelliSense 支持、攜帶豐富數據

最佳實踐建議

  • 事件名採用動詞過去式(LoginClicked、DataSaved)
  • 委托簽名固定為 (object sender, TEventArgs e)
  • 觸發前用 ?.Invoke 防空引用
  • 控件只負責 UI 交互與數據收集,業務邏輯完全交給宿主頁面

掌握委托在用戶控件中的應用,能讓你輕鬆構建高復用、低耦合的 Web 組件庫。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved