0

我有以下功能更新加入/加載的是Default.aspx中的佔位符的ASCX定製用戶控件UpdatePanel的內容:自定義用戶控件的內容上按一下按鈕回傳消失

protected void NavigationTab_Click(string ascxpath) 
       {   
         Control ctrl = LoadControl(ascxpath); 
         //cphmaincontent is my asp ContenPlaceHoderId in masterpage 
         PlaceHolder phmaincontent = (PlaceHolder)cphmaincontent.FindControl("phmaincontent"); 
         phmaincontent.Controls.Clear(); 
         phmaincontent.Controls.Add(ctrl); 
         upmaincontent.Update();    
       } 

母版的UpdatePanel:

<asp:UpdatePanel ID="upmaincontent" runat="server" UpdateMode="Conditional"> 
        <ContentTemplate> 
         <asp:Label ID="lbmsg" runat="server" Text=""></asp:Label> 
         <asp:ContentPlaceHolder ID="cphmaincontent" runat="server">      
         </asp:ContentPlaceHolder>       
        </ContentTemplate> 
       </asp:UpdatePanel>    

我從我的導航控制是另一個自定義ascx控件,我CTRL控制對象是動態加載每個調用NavigationTab_Click有按鈕和標籤時我點擊按鈕,只需將一些文本重新分配給標籤。

,我有我的母版這下面的代碼只是爲了讓ASCX控制路徑:

protected override void OnInit(EventArgs e) 
     {   
       //raising an event to set ascx path 
       mainmenu.NavigatePath += new usercontrols.mainmenu.NavigationHandler(NavigationTab_Click); 

       base.OnInit(e);   
     } 

到目前爲止一切正常良好,通過調用NavigationTab_Click功能加載我CTRL對象後,我看到我CTRL佔位符並有按鈕和標籤,但問題是這個,如果我點擊這個按鈕,它應該重新分配一些文本的標籤,但相反,整個Ctrl控制內容消失,請幫助。

回答

0

當您動態添加控件時,您必須確保它在每次回發時都被重新創建。您還必須確保您分配的ID與以前相同,否則事件將無法正確觸發,並且無法從ViewState重新加載值。這最後必須完成Page_Load(在Page_Init中更好)。

這就是爲什麼你應該儘可能避免動態控制的原因。

因此,您可以像事情一樣在事件處理程序中添加控件。但是它們必須在下一個Postback上重新創建。因此,您需要在某處存儲什麼(f.e。ID)或已經創建了多少個控件。這可以通過例如ViewStateSession來完成。然後,您可以爲控件分配適當的ID(例如,索引或ID後綴)。

以下是關於這個問題的一些附加信息:

+0

,如果我做我的班序列化的話,我不認爲我需要創建的ViewState每個控制我有我保存類對象,然後我把它放回去,並將它們分配給控件權利? – 2012-03-13 21:19:53

+0

另外,我添加了這個「ViewState [」ASCXPATH「] = ascxpath;」在我的「NavigationTab_Click()」,他們都在masterpage.cs,然後我檢查Page_Load()如果ViewState [「ASCXPATH」]!= null然後再次調用相同的函數「NavigationTab_Click(ViewState [」ASCXPATH「]。ToString ))「 但我仍然不能使它加載,因爲當我調試它時,ViewState [」ASCXPATH「]仍然是空的,我認爲它不應該! – 2012-03-13 21:31:41

+0

@NazoTajrian:不要將控件實例存儲在ViewState中,而只需要將這些信息正確地重新創建。其實我還沒有理解你爲什麼要動態地將它們添加到頁面而不是切換它們的'Visible'屬性。你有一個靜態數量的NavigationTabs,不是嗎?如果您可以回答是,請不要動態添加您的UserControl。 – 2012-03-13 21:47:03