【问题标题】:Events in my dynamically loaded user controls do not fire in ASP.NET Web Application我的动态加载的用户控件中的事件不会在 ASP.NET Web 应用程序中触发
【发布时间】:2012-01-18 17:38:17
【问题描述】:

我有 ASP.NET Web 应用程序,其中包含 MasterPage、ASPX 页面,我根据菜单选择将用户控件动态加载到包含 PlaceHolder 的 UpdatePanel 中。这工作正常。问题是我的用户控件中的任何事件都不起作用。我有不同的场景:

  1. DropDownList,其中选定的值应加载不同的用户控件
  2. LinkBut​​ton,其中 Click 事件应将不同的 UserControl 加载到 PlaceHolder(在父页面上)。

我现在已经花了 3 天的时间为此尝试了几件事.... 注册事件,使用接口等等....

但到目前为止没有任何效果:( ..感谢我能得到的任何帮助。

是的,我也在用户控件上尝试了 Page_PreInit 事件。 当我在用户控件中单击 LinkBut​​ton(或 DropDownList)时唯一触发的是父页面上的 Page_Load 事件。然后包含用户控件(我正在单击)的 PlaceHolder 具有 Contol.Count = null 这是一些代码

//Page_Load on parent page:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            LoadDefaultControl(ctrlPlaceHolder, Base_Path + "_Services.ascx");
        }
    }

//我的用户控件中的Page_Load

protected void Page_Load(object sender, EventArgs e)
    {
        btJoomlaManagement.Click += btJoomlaManagement_Click;
    }

父页面上的 PlaceHolder 位于 UpdatePanel >> ContentTemplate 内。

               <asp:UpdatePanel ID="pnlControlContainer" runat="server" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:PlaceHolder ID="ctrlPlaceHolder" runat="server" EnableViewState="False" />
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="menuServices" />
                </Triggers>
            </asp:UpdatePanel>

行为如下..当我加载我的 USerControl Page_Load 并运行 Click 事件时..当我单击我的用户控件中的链接按钮时,父页面上的 Page_Load 运行但我的用户控件中的 Click 方法不运行。用户控件(我刚刚单击了我的链接按钮)消失了。

所以我的事件(点击)不会触发......希望你能理解得更好一点。

【问题讨论】:

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


    【解决方案1】:

    您需要在每次回发时重新创建动态控件,记住页面实例是根据请求创建的,如果您不重新创建控件,则回发上不会存在该控件。

    当然你的控制消失了,你没有在回发时重新创建它。

    here

    提取

    必须以编程方式将动态添加的控件添加到 Web 每个页面访问的页面。添加这些控件的最佳时机 是在页面生命周期的初始化阶段,即 发生在加载视图状态阶段之前。也就是说,我们希望拥有 控制层次结构在加载视图状态阶段到达之前完成。 因此,最好为 Page 创建一个事件处理程序 类的 Init 事件在您的代码隐藏类中,并添加您的动态 控制在那里。

    【讨论】:

    • 我不想再次重新创建控件。我想将新控件加载到父页面的占位符中。那我必须重新创建控件吗?
    • 您必须在每次回发时重新创建您的控件,否则它将来自哪里?您正在处理的Page 实例是一个新实例,对您在原始实例中创建的控件一无所知。请参阅stackoverflow.com/questions/5046101/…
    • 我相信这可能是正确的答案。一开始很难理解,但页面生命周期应该可以帮助您理解。当你点击你的整个页面回帖时,控件就会消失,事件不再存在。
    • @RichardFriend 链接不可用,请添加新链接和/或更新您的答案。
    【解决方案2】:

    您是否尝试在 Page_Init 事件而不是 Page_Load 中附加事件?这就是我在动态控制应用程序中进行事件分配的方式,对此没有任何问题。另外,您提到这是在 UpdatePanel 中完成的,是在内容模板中吗?如果是这样,您是否为其添加了适当的触发器(如果您确实希望以 AJAX 方式发生这种情况)?

    您是否将“autopostback”属性设置为 true?

    查看一些代码肯定会有所帮助...

    【讨论】:

    • 是的,我也在用户控件上尝试了 Page_PreInit 事件。当我在用户控件中单击 LinkBut​​ton(或 DropDownList)时唯一触发的是父页面上的 Page_Load 事件。然后包含用户控件(我正在单击)的 PlaceHolder 具有 Contol.Count = null 这是一些代码
    猜你喜欢
    • 2011-12-17
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多