处理包含页面的用户控制事件

时间:2009-06-03 09:14:32

标签: asp.net user-controls

我想要一个包含保存按钮的用户控件。

我希望附加到保存按钮的click事件由包含页面而不是用户控件

处理

这可能吗?

编辑更具体的

假设我有一个名为“Editor Page”的页面和一个名为“Editor Buttons”的用户控件。 在“编辑器按钮”用户控件上,我有一个保存按钮(这是一个Web控件)。我希望保存按钮的Click事件由“编辑器页面”而不是用户控件处理。

原因是因为我想指定实现常见行为的基页。

3 个答案:

答案 0 :(得分:6)

这种技术通常被称为“事件冒泡”。

这是一个例子:

public partial class Test : System.Web.UI.UserControl

{

 public event EventHandler buttonClick;

 protected void Button1_Click(object sender, EventArgs e)
 {
     buttonClick(sender, e);
 }

}

然后您可以订阅活动按钮点击网页以显示不同的信息。

public partial class Test: System.Web.UI.Page
 {
 protected void Page_Load(object sender, EventArgs e)
 {

 UserControlID.buttonClick+=new EventHandler(UserControlID_buttonClick);

}

protected void UserControlID_buttonClick(object sender, EventArgs e)
 {
     Response.Write("hello,I am jack.");
 }

}

答案 1 :(得分:4)

我将假设您拥有UserControl的代码。如果是这种情况,您可以在用户控件中定义一个Save事件,让它公开保存按钮的Click事件either directly,或者通过内部设置事件处理程序并在按钮时引发Save事件点击。这可能在UserControl中看起来像这样:

public event EventHandler Save;

private void SaveButton_Click(object sender, EventArgs e)
{
    OnSave(e);
}

protected void OnSave(EventArgs e)
{
    // raise the Save event
    EventHandler save = Save;
    if (save != null)
    {
        save(this, e);
    }
}

答案 2 :(得分:1)

UserControl1.ascx

UserControl1.ascx.cs

public partial class UserControl1:System.Web.UI.UserControl

{

public event EventHandler UserControl1Click;



protected void Page_Load(object sender, EventArgs e)

{

}



protected void btn1_Click(object sender, EventArgs e)

{

    UserControl1Click(sender, e);

}

}

UserControl2.ascx

UserControl1.ascx.cs

public partial class UserControl2:System.Web.UI.UserControl

{

public event EventHandler UserControl2Click;



protected void Page_Load(object sender, EventArgs e)

{

} 




protected void btn2_Click(object sender, EventArgs e)

{

    UserControl2Click(sender, e);

}

}

然后将一个Asp.Net文本框(显示用户控件ID)和两个用户控件添加到Aspx页面,如下所示。

<title>Untitled Page</title>

<form id="form1" runat="server">



<div>



<asp:TextBox ID="txt1" runat="server"></asp:TextBox> <br />



<UC1:UC ID="uc1" runat="server" />



<UC1:UC ID="uc2" runat="server" />



</div>



</form>

现在为每个用户控件添加事件处理程序,以处理两个控件的按钮单击事件,如下所示。

public partial class _Default:System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

    uc1.UserControl1Click += new EventHandler(uc1_UserControl1Click);

    uc2.UserControl2Click += new EventHandler(uc2_UserControl2Click);

}



protected void uc1_UserControl1Click(object sender, EventArgs e)

{

    txt1.Text = "User Control 1 Clicked";

}



protected void uc2_UserControl2Click(object sender, EventArgs e)

{

    txt1.Text = "User Control 2 Clicked";

}

}

如果我们点击User Control1,文本框会显示“User Control 1 Clicked”,或者如果我们点击User Control2,文本框会显示“User Control 2 Clicked”。