ASP.NET 使用者控件 (.ascx) 預設不支援事件直接向包含頁面傳遞。本文示範如何透過自訂委派與事件,實現控件內部按鈕點擊觸發頁面端處理邏輯。
UserControl.ascx.cs)public delegate void ClickEventHandler(object sender, EventArgs e);
public partial class MyUserControl : System.Web.UI.UserControl
{
protected System.Web.UI.WebControls.Button AButton;
// 1. 宣告公開事件
public event ClickEventHandler Click;
// 2. 定義引發事件的保護方法
protected virtual void OnClick(EventArgs e)
{
Click?.Invoke(this, e); // C# 6.0+ null 條件運算子
}
// 3. 內部按鈕點擊事件處理
protected void AButton_Click(object sender, EventArgs e)
{
OnClick(e); // 引發自訂事件
}
}
Page.aspx.cs)public partial class MyPage : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
// 1. 透過 FindControl 取得控件實例
MyUserControl uc = this.FindControl("myUserControlID") as MyUserControl;
if (uc != null)
{
// 2. 訂閱控件事件
uc.Click += new ClickEventHandler(UserControl_Clicked);
}
}
// 3. 事件處理方法
private void UserControl_Clicked(object sender, EventArgs e)
{
// 處理來自使用者控件的點擊邏輯
lblMessage.Text = "收到 UserControl 傳來的事件!";
}
}
Page.aspx)<%@ Register Src="~/Controls/UserControl.ascx" TagPrefix="uc" TagName="MyControl" %>
...
<uc:MyControl ID="myUserControlID" runat="server" />
ClickEventHandler)。public event ClickEventHandler Click;。OnClick 引發事件。Page_Init (較早階段) 找到控件實例並掛上處理器。此模式不限於 UI 層,同樣適用於業務邏輯層 (BLL) 解耦,實作 Observer Pattern,降低物件間耦合度。控件完全不需知道包含它的頁面是誰,僅負責「發布」事件。