2010-03-19 29 views
3

我有一個嵌套在中繼器中的用戶控件。 在我的用戶控件裏面我有另一箇中繼器,並且我有一個面板。LoadViewState未在我的用戶控件上觸發

我想覆蓋我的用戶控件的LoadViewState事件並動態地將控件添加到面板。我想在LoadViewState中這樣做,以便動態控件在視圖狀態被加載之前被添加,所以它們在回發後保留它們的值。

由於某種原因,用戶控件(ascx)上的LoadViewState事件未觸發。有什麼辦法可以強制它開火,還是有另一種方法可以使用?我已經排除了用戶控件中繼器數據綁定事件,因爲即使數據綁定沒有發生,我也需要它來工作,並且我無法在中繼器項目創建的事件中執行此操作,因爲子面板和內部html不存在然而。

+0

你可以發佈你的代碼隱藏嗎?或者它的樣本? –

回答

6

LoadViewState不適合添加子控件。要在用戶控件內動態添加控件,您需要查看CreateChildControls方法。

它不會觸發LoadViewState事件,因爲您需要在ViewState中至少保存一個值才能觸發事件。

+0

WebCotnrols怎麼樣? LoadViewState不會在我的WebControl中觸發。我創建了一個從WebControl繼承的類。 –

0

我想我有一些類似的問題,一些動態創建的兒童用戶控件。 LoadViewState未在回發中調用,即使我能夠在首先創建它們時訪問其ViewState。 SaveViewState似乎也被正確調用。它結束了,在他們完全初始化之前,頁面Init事件中的子ViewState並不真正可用(沒有發生這種異常),並且這僅在將控件添加到父項時發生。確保了這一點後,ViewState的孩子在回傳中正確保持。

// Belongs to a Page. If you create the children control in the 
    // Load event in you can also access the page ViewState 
    protected void Page_Init(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      for (int it = 0; it < 5; it++) 
      { 
       ChildControl child = LoadControl("ChildControl.ascx") 
        as ChildControl; 
       child.ParentPage = this; 
       TabPanel tab = tabContainer.FindControl("TabPanel" + it) 
        as TabPanel; 
       // Ensure to add the child control to its parent before 
       // accessing its ViewState! 
       tab.Controls.Add(child);  // <--- 
       string caption = "Ciao" + it; 
       child.Caption = caption;  // Here we access the ViewState 
       tab.HeaderText = caption; 
       tab.Visible = true; 
       _Children.Add(child); 
      } 
     } 
     [...] 
    } 

    // Belongs to ChildControl 
    public string Caption 
    { 
     get { return ViewState["Caption"] as string; } 
     internal set { this.ViewState["Caption"] = value; } 
    } 
相關問題