asp.net用户控件事件传播麻烦

时间:2010-01-06 16:42:33

标签: c# asp.net events user-controls

我有一个简单的用户控件,其中包含一些按钮,这些按钮可以使用控件触发我希望由页面处理的事件。我有我的代码设置:

public event EventHandler Cancel;
public event EventHandler Confirm;
public void Confirm_Click(object sender, EventArgs e)
{
    if (Confirm != null)
        Confirm(this, e);
}
public void Cancel_Click(object sender, EventArgs e)
{
    if (Cancel != null) 
        Cancel(this, e);
}

但是当我尝试从使用控件的页面加载事件的页面调用这些时,我没有得到任何自定义事件

ASPX代码

<%@ Register TagPrefix="btg" TagName="CustomControl" Src="~/Search/CustomControl.ascx" %>
<btg:CustomControl ID="btgControl" runat="server" ></btg:CustomControl>

这可能是因为用户控件中的按钮位于更新面板中吗?

1 个答案:

答案 0 :(得分:1)

你不应该看到方法。你应该看到事件。

在您的父页面加载中,您需要执行以下操作:

myUserControl.Cancel += new EventHandler(myUserControl_Cancel);

您可以点击标签,标签来自动生成方法存根。这看起来像是:

void myUserControl_Cancel(object sender, EventArgs e) {}

然后,此代码将在用户控件的方法中调用后触发。为了激活该代码,您必须将事件分配给用户控件上的按钮事件。

编辑:myUserControl是您的用户控件的ID。另外,有些人认为事件处理程序应该在你的页面的init方法中。

编辑:

您的用户控件是否在页面中正确引用了?即您是在web.config中注册用户控件还是在页面中使用引用指令?

另外,您是否尝试过清洁解决方案并进行重建?如果动态创建/加载了用户控件,则必须在与实例化控件相同的范围内连接事件。要动态加载用户控件,您必须在页面中放置占位符并执行以下操作:

UserControl control = Page.LoadControl("~/ControlPath/ControlName.ascx");
((MyUserControlClass)control).Cancel += += new EventHandler(myUserControl_Cancel); // etc...