.net页面事件触发订单更改

时间:2009-05-07 12:17:46

标签: c# .net controls postback custom-server-controls

好的,这是一个非常烦人的错误,我整个上午都遇到过问题!

我有一个自定义控件,我们在许多项目中使用了自定义控件,这些控件具有通过调用页面onload设置并存储在Viewstate中的属性。控件在自定义控件的CreateChildControls()方法上设置具有属性的子控件。

正常情况下,在回发时会触发Page_Load事件,然后触发页面上控件的CreateChildControls方法。

奇怪的是,我们在网站上有一个登录系统(自定义成员资格提供程序),当用户登录时,相反的情况发生CreateChildControls()方法然后触发Page_Load,因此控件属性是错误的(设置自以前的回发)

事件如何以不同的顺序发射?我认为所有页面事件都以相同的顺序发生,无论如何,我都不知道如何登录会改变该顺序。

更新:似乎问题是我没有调用EnsureChildControls(),但我不确定它应该在哪里调用?如果控件上设置了几个用于设置子控件的属性我何时应该调用EnsureChildControls(),我想我不完全理解EnsureChildControls()的作用?

2 个答案:

答案 0 :(得分:4)

只要ASP.NET页面需要,就会调用CreateChildControls。页面循环中没有特定点。它可能发生在Init事件中,它可能发生在Load事件中。如果要确保子控件可用,请调用控件的EnsureChildControls()方法。您可以在控件的Init事件中执行此操作,以确保在整个生命周期中都有子控件,或者您可以在需要引用其中一个子控件时执行此操作 - 例如在你控制的属性的getter / setter中。

答案 1 :(得分:1)

在创建需要访问包含的子控件的服务器/用户控件的属性时,我使用以下命令:

public Whatever SomeProperty
{

    get
    {
        EnsureChildControls();
        <more code here>
    }
    set
    {
        EnsureChildControls();
        <more code here>
    }
}

这可确保您的控件使用者可以在页面生命周期的各个阶段自由使用您的控件。