ASP.NET usercontrol:检查usercontrol是否可见

时间:2010-07-19 14:14:45

标签: c# asp.net

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

只有在单击按钮时才能看到UserControl。 所以我的usercontrol设置如下:

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

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

我的UserControl可能先加载,然后设置Visible属性? 有没有一种简单的方法可以解决这个问题?

提前致谢!

3 个答案:

答案 0 :(得分:1)

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

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

我猜你正在进行某种数据检索,或者如果控件不可见则要避免。不幸的是,关于页面生命周期和事件触发顺序的这类问题在ASP.Net编程中是一个常见的问题。

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

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

答案 1 :(得分:0)

将您在Control的Page_Load事件中调用的代码放入PostBack事件中。确保按钮的autopostback设置为true。

答案 2 :(得分:0)

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