ASP.NET用户控件事件传播问题

3

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

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
需要查看页面代码。您是否正确转换了控件的类型? - womp
1个回答

1

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

在你的父页面加载时,你需要这样做:

myUserControl.Cancel += new EventHandler(myUserControl_Cancel);

你可以按下tab键两次来自动生成方法桩。这将会是这样的:
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...

这就是我的意思,我的父页面中没有可用的事件。 - Jimmy
抱歉,我从您的原始帖子中推断您试图直接访问方法。您是指 IntelliSense 中没有显示吗?我更新了我的答案,提供了更多可能性。能否发布包含控件添加和页面加载的 aspx 代码? - Joseph Yaduvanshi
我已经重建和清理了我的解决方案多次,控件被正确调用并在浏览页面时加载。在页面上使用用户控件的名称而不是其ID时,我犯了一个错误,但我仍然无法访问任何事件以委托它们。 - Jimmy
当我通过代码后台加载控件时,我能够看到事件,也许这是由于Visual Studio无法在代码中找到我的用户控件的问题。 - Jimmy
1
我只是想避免与aspx代码搞砸的麻烦,所以会从代码后台来完成它,非常感谢。 - Jimmy
由于您的按钮位于UpdatePanel中,您必须确保它们正在正确地进行提交(异步或后台提交)。示例在此处:http://msdn.microsoft.com/en-us/library/system.web.ui.asyncpostbacktrigger.aspx - Joseph Yaduvanshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接