【问题标题】:ASP.NET usercontrol: check if usercontrol is visibleASP.NET 用户控件:检查用户控件是否可见
【发布时间】:2011-03-17 22:43:37
【问题描述】:

我的问题与此线程有些相关:How to avoid Initialization of web user control inside aspx?

用户控件应该仅在单击按钮时可见。 所以我的用户控件是这样设置的:

<example:usercontrol ID="idControl" runat="server" Visible="false" />
<asp:Button ID="showMyControl" runat="server" OnClick="ShowMyControl" /

并且用户控件本身会检查他是否可见:

protected void Page_Load( object sender, EventArgs e ) {
    // only execute if the user control is visible
    if ( this.Visible ) {
        ...
    }
}

当我单击按钮时,我将 usercontrol 的属性 Visible 设置为 true,但是当回发发生时,usercontrol 的 Page_Load 中的 Visible-property 仍设置为 false。

我的 UserControl 可能会先加载,然后再设置 Visible-property? 有没有简单的方法来解决这个问题?

提前致谢!

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    如果我理解正确,您的控件的 Load 事件将由您的 Page_Load 事件处理程序方法处理,它在您的按钮控件的 Click 事件之前被触发。因此,当 Page_Load 方法检查this.Visible 时,该属性尚未更改,因为尚未执行 Click 事件处理程序。

    因此,我认为在 PreRender 事件而不是 Load 事件中检查控件的 Visible 属性会更合适。

    我猜您正在执行某种数据检索或在控件不可见时您希望避免的某些事情。不幸的是,这类关于页面生命周期和事件触发顺序的问题是 ASP.Net 编程中需要处理的常见问题。

    如果您的所有初始化代码都可以轻松移动到 PreRender 事件中,那就太好了。问题已解决(希望如此)。如果不是(即您需要在 PreRender 之前发生一些事情),您可能需要提出一些其他机制来确保您的代码在正确的时间执行。例如,您可以在控件上公开一个“SetVisible”方法,该方法将 Visible 属性设置为 true,然后还执行所需的任何初始化逻辑。这样做的缺点是您不能真正保证某些代码不会在您提供的 SetVisible 方法之外将控件的 Visible 属性设置为 true。

    另一个想法是实际覆盖 Visible 属性并在该属性设置为 true 时执行初始化逻辑。

    【讨论】:

      【解决方案2】:

      将您在控件的 Page_Load 事件中调用的代码放入 PostBack 事件中。确保按钮的自动回发设置为 true。

      【讨论】:

        【解决方案3】:

        您正在寻找的是 Control.EnsureChildControls 方法。这种方法存在于这种情况。它将确保所有子控件都已创建。然后你可以设置你的可见属性。

        【讨论】:

        • 这不是解决方案,但我不知道这种方法,所以毕竟我学到了一些新东西:)
        猜你喜欢
        • 1970-01-01
        • 2011-07-28
        • 1970-01-01
        • 1970-01-01
        • 2011-06-12
        • 2015-04-13
        • 2016-01-06
        • 2016-01-21
        • 1970-01-01
        相关资源
        最近更新 更多