2010-07-19 95 views
1

我的问题具有一定的相关的主题:一个按钮被点击时How to avoid Initialization of web user control inside aspx?ASP.NET用户控件:检查,如果用户控件是可见

的用户控件只应是可见的。 所以我的用户设置是这样的:

<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属性的用户控件的设置为true,但当发生回发时,usercontrol的Page_Load中的Visible-property仍然设置为false。

我的用户控件可能先被加载,然后设置Visible属性? 有没有简单的方法来解决这个问题?

提前致谢!

回答

1

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

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

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

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

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

0

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

0

你在找什么是Control.EnsureChildControls方法。这种方法存在这种情况。它将确保所有的儿童控制已经创建。然后你可以设置你的可见属性。

+0

这不是解决方案,但我不知道这种方法,所以毕竟我学到了新东西:) – thomasvdb 2010-07-19 15:03:13