用户控件的事件处理程序未触发

6

我动态地将一个UserControl加载到MultiView控件中的View中。虽然UserControl添加了事件处理程序,但事件从未触发。

我错过了什么吗? 谢谢!

包含ASPX页面:

protected override void OnPreRender(EventArgs e)
{
    if (MultiView1.ActiveViewIndex == 2) //If the tab is selected, load control
    {
        Control Presenter = LoadControl("Presenter.ascx");
        (MultiView1.ActiveViewIndex.Views[2].Controls.Add(Presenter);
    }
    base.OnPreRender(e);
}

Presenter.ascx.cs

override protected void OnInit(EventArgs e)
{
    Retry.Click += this.Retry_Click; //This is a .Net 2.0 project
    base.OnInit(e);
}


protected void Retry_Click(object sender, EventArgs e)
{
    //This never fires
}
4个回答

8

我认为它没有触发是因为您在页面的prerender事件中加载了控件。在回发后,由于没有视图状态,控件被丢失。因此,没有控件来触发其事件。请尝试在页面的init事件中加载控件。让我们知道发生了什么!


就这样了。谢谢! 我还必须删除If语句,因为在OnPreInit中,MultiView1.ActiveViewIndex没有设置。 - Mark Maslar

6
Postback事件处理在呈现之前完成,因此在您的情况下控件不会出现在页面中。
生命周期事件按以下顺序触发(跳过了一些):
1. 初始化 2. 加载 3. 预呈现 4. 卸载
事件处理在加载和预呈现之间进行(如果某些事件更改页面应呈现的方式,则有意义)。
因此,只需将加载Retry控件的代码移动到Load或Init中即可。
参考:Asp.Net页面生命周期概述

2

控件必须在OnPreRender事件中可见,才能输入。 但是也许你希望它不可见。 那么请确保EnableViewState = false;


1

听起来好像控件在每次回传后没有被添加,我建议您将包含aspx页面中的if语句删除,看看是否可以解决这个问题...我猜Retry是一个按钮?


我已经尝试过删除If语句——没有任何区别。 是的,Retry是一个按钮。 - Mark Maslar

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