.NET控制事件和页面生命周期

时间:2009-03-27 14:02:38

标签: c# .net user-controls controls

这是问题....我有三个组件...一个包含用户控件和用户控件中的服务器端控件的页面。用户控件有一些页面侦听的事件,这些事件会改变服务器端控件的作用。

服务器控件实际上创建了一个电视指南查找列表,其中包含许多需要具有事件的较小ASP.NET控件。所有这些控件都是动态创建的(显然是服务器端)。填充此服务器端控件需要本质上是密集的操作,因此每次回发只应执行一次。 Event1和Event2触发并基本上会改变有关服务器端控件呈现(排序,过滤等)的事情,所以当它们触发时我需要确定调用PopulateControls。

问题在于:我找不到调用PopulateControls的最佳位置。如果我把它放在PageLoad中,它会在任何事件发生之前触发并绘制列表。然后我的事件必须调用PopulateControls来响应事件。如果我把调用放在PreRender中,服务器端控件的事件不会触发,因为从我读到的内容,它们需要在PageLoad之前或期间创建。

那么我在哪里拨打这个电话,以便我只需要调用一次,以便它可以响应正确的事件?

这是一些伪代码

public class MyPage : System.Web.UI.Page
{
    protected UserControl MyUserControl;

    // Wire up event handlers
    MyUserControl.Event1 += OnEvent1;
    MyUserControl.Event2 += OnEvent2;

    public Page_Load()
    {
    }

    public PreRender()
    {
        PopulateControls();
    }

    private PopulateControls()
    {
        // Do intensive operation to populate controls
    }

    protected OnEvent1()
    {
    }

    protected OnEvent2()
    {
    }
}

3 个答案:

答案 0 :(得分:1)

我可能会在这里遗漏一些东西,但无论如何我都会对此表示不满。您必须创建与初始渲染相同的控件层次结构,以便您匹配并允许事件正常触发。听起来您需要在事件触发后进行一些重新排序,因此您需要创建两次控件。

修改 您需要能够在回发时重新创建控件和控件层次结构。您应该向客户端发送足够的信息,以便您可以在回发上正确地重新创建控件。如有必要,可以通过在ViewState中保存信息来完成此操作。

只有在需要时才应重新计算控制信息。在你的情况下,因为一些回发事件。

基本流程应该是这样的。在Load事件中,如果您没有创建控件所需的ViewState,请调用populate方法,否则从ViewState创建它们。当回发发生时,Load事件将创建它们,但它们正在从viewstate重建,所以这应该是便宜的。当回发事件触发时,调用populate方法以新订单或新信息重新创建控件,具体取决于发生的事件。

每当我构建一个控件时,我都想考虑如果从页面上的其他控件发回一个回调,控件将如何表现。您的控件应该继续看起来相同,除非受到该帖子的影响,并且应该能够在不进行任何数据访问的情况下重新创建它,而是从之前调用时收集的信息中重新创建。

我编辑了我的答案,希望现在这是一个更清晰的答案。

答案 1 :(得分:0)

应该在CreateChildControls中创建子控件,在控件生命周期的“Init”阶段调用它。

答案 2 :(得分:0)

在页面或任何子控件发生任何其他事件之前调用您想要调用的事件的最佳位置是在PageInit阶段。

这是一篇不错的文章,讨论了使用用户控件的页面生命周期: http://www.codeasp.net/articles/asp.net/20/aspnet-page-lifecycle