使用者控件封裝多個伺服器控件後,在頁面中表現為單一控件,設計時期無法直接存取其內部子控件。為提供對外介面,需透過屬性控制子控件狀態、事件通知父頁面內部行為發生。
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="uc1.ascx.cs" Inherits="uc1" %>
<asp:DataList ID="dlshow" runat="server" RepeatDirection="Horizontal" OnSelectedIndexChanged="dlshow_SelectedIndexChanged">
<ItemTemplate>
<asp:LinkButton ID="linkbtn" runat="server" CommandName="Select" Text='<%# Container.DataItem %>' />
</ItemTemplate>
</asp:DataList>
public partial class uc1 : System.Web.UI.UserControl
{
// 定義對外事件
public event EventHandler TabClick;
private int index;
public int Index
{
get { return index; }
set { index = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
List<string> list = new List<string> { "tab1", "tab2", "tab3", "tab4" };
dlshow.DataSource = list;
dlshow.DataBind();
dlshow.SelectedIndex = 0;
}
}
protected void dlshow_SelectedIndexChanged(object sender, EventArgs e)
{
// 示範:直接存取父頁面控件(不推薦生產環境使用,僅示範機制)
Label lbl = this.Parent.FindControl("lblshow") as Label;
if (lbl != null) lbl.Text = "Access Parent Page Control";
index = dlshow.SelectedIndex;
// 觸發自訂事件通知父頁面
TabClick(this, EventArgs.Empty);
}
}
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ShowUc.aspx.cs" Inherits="ShowUc" %>
<%@ Register TagPrefix="my" TagName="tab" Src="~/uc1.ascx" %>
<html><body>
<form id="form1" runat="server">
<div>
<my:tab ID="Mytab" runat="server" OnTabClick="Mytab_TabClick" />
<br />
<asp:Label ID="lblshow" runat="server" Text="Label" />
</div>
</form>
</body></html>
public partial class ShowUc : System.Web.UI.Page
{
protected void Mytab_TabClick(object sender, EventArgs e)
{
int index = Mytab.Index;
Response.Write("You selected the index " + index);
}
}
public event EventHandler 定義對外事件契約TabClick(this, EventArgs.Empty) 觸發OnTabClick 事件處理常式Index 提供狀態查詢介面,實現雙向通訊此模式實現鬆耦合的元件化架構,是 ASP.NET Web Forms 開發中複用邏輯單元的標準作法。