2009-02-28 66 views
1

基本上,我有一個下拉列表和一個動態添加的用戶控件。用戶控件根據在下拉列表中進行的選擇加載網格視圖。下拉列表不是用戶控件的一部分。ViewState,UserControl和IsPostback

現在,問題是,如何在每次用戶更改下拉列表中的選擇時模擬(isControlPostback = false)?它看起來像ViewState記得控制。

在我的用戶控件我有:

protected bool IsUserControlPostBack 
{ 
    get 
    { 
     return this.ViewState["IsUserControlPostBack"] != null; 
    } 
} 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsUserControlPostBack) 
    { 
     ViewState.Add("IsUserControlPostBack", true); 
     //load stuff in the grid view and bind it 
    } 
} 

當用戶改變的下拉列表中選擇,我有一個JavaScript確認框,以及頁面回。因此,下拉列表中的OnSelectedIndexChanged事件不會被觸發。我想刪除每次選定的索引更改時執行此操作: ViewState.Remove(「IsUserControlPostBack」);

+0

我剛剛發現控件的OnLoad事件在頁面的OnLoad事件之後立即執行,並且在任何其他頁面下拉列表事件之前執行。所以基本上,我在頁面響應由下拉列表觸發的任何更改之前加載用戶控件。這種行爲本質上是問題。 – sarsnake 2009-02-28 01:19:04

回答

0

對於任何人誰是有興趣知道答案: 我最終實現用戶控件內的公共屬性和加載服務器內部控制下拉列表SelectedIndexChanged事件,而不是OnInit的。這消除了顯式Viewstate使用的需要。

0

將控件添加到OnLoad之前的某個頁面。例如。是OnInit。在OnInit和OnLoad之間,viewstate被加載並且運行回發事件。

+0

它已經被添加在OnInit – sarsnake 2009-03-02 18:19:09

1

您可以更改prerender事件中的控件。當這個事件被觸發時,所有其他動作都會被觸發。 或者您可以在用戶控制中進行公共財產的設置,並在需要設置值時作出適當反應。

1

您在用戶控件中訪問的ViewState與您在頁面上訪問的不一樣。如果你需要你的頁面與你的用戶控件進行通信,我建議你爲此目的在你的用戶控件上添加一個公共方法。

如果由於某種原因,你更喜歡類似 東西,你的瀏覽狀態 的方法,你可以試試Context.Items。 請注意Context.Items不是 保留在請求之間。

+0

當我加載頁面上的控件,我正在做一些像 Control control = Load(「controlname.ascx」); 控制是否可以訪問公共方法? 事情是我不希望控制刷新每次我加載它 - 但只有當下拉列表選擇更改。 – sarsnake 2009-03-02 03:30:49