Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET控件事件和页生命周期_C#_.net_User Controls_Controls - Fatal编程技术网

C# .NET控件事件和页生命周期

C# .NET控件事件和页生命周期,c#,.net,user-controls,controls,C#,.net,User Controls,Controls,问题是……我有三个组件……一个包含用户控件的页面和一个位于用户控件中的服务器端控件。用户控件有一些页面侦听的事件,这些事件会更改服务器端控件的操作 服务器控件实质上创建了一个电视指南列表,其中包含许多需要有事件的较小ASP.NET控件。所有这些控件都是动态创建的(显然是服务器端)。填充此服务器端控件需要本质上密集的操作,因此每次回发只能执行一次。Event1和Event2启动,基本上会改变服务器端控件呈现(排序、筛选等)的情况,因此当它们启动时,我需要调用PopulateControls 问题是

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

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

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

那么我应该把这个电话放在哪里,这样我只需要打一次电话,这样它就可以对适当的事件做出反应

这里有一些psuedo代码

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()
    {
    }
}

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

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

下面是一篇讨论页面生命周期和用户控件的文章:

我可能在这里遗漏了什么,但无论如何,我会尝试一下。必须创建与初始呈现相同的控件层次结构,以便ID匹配并允许事件正确触发。听起来您需要在事件触发后进行一些重新排序,因此需要创建两次控件

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

您应该仅在需要时重新计算控件信息。在你的情况下,因为一些事后事件

基本流程应该是这样的。在Load事件中,如果没有创建控件所需的ViewState,请调用填充方法,否则从ViewState创建控件。当发生回发时,加载事件将创建它们,但它们是从viewstate重建的,所以这应该是便宜的。当触发回发事件时,根据发生的事件,调用populate方法以新顺序或使用新信息重新创建控件

每当我构建一个控件时,我都喜欢考虑如果页面上的其他控件发生回发,该控件将如何运行。除非受到回帖的影响,否则控件的外观应保持不变,并且应能够在不进行任何数据访问的情况下重新创建控件,但应使用它在以前调用中收集的信息


我编辑了我的答案,希望现在能更清楚一点。

同意,但这并不能解决我的问题。如果我在那里创建它们,我将不得不在稍后触发事件时重新创建它们,因为事件更改了需要绘制的内容。我不会调用任何事件…这些事件是对用户所做操作的响应…例如,onclick等。它们是在页面加载后被点击的,这仅仅是由于.NET工作方式的性质。如果我正确理解了您的问题,您希望usercontrol中的事件在其他事件发生之前触发。这将在其他地方触发事件,比如在您的页面中。在这种情况下,您需要将控件绑定逻辑放在控件的PageInit中,而不是页面本身。我很困惑……我认为事件的顺序无法调整。看见控制事件总是在页面加载完成后发生。