2010-07-19 70 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