我的问题与此主题有些相关: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属性? 有没有一种简单的方法可以解决这个问题?
提前致谢!
答案 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方法。这种方法适用于这种情况。它将确保已创建所有子控件。然后你可以设置你的可见属性。