2010-09-02 171 views
1

我有一個名爲UC_Widget的UserControl,它從System.Web.UI.UserControl和ITextControl繼承。它也覆蓋了AddParsedSubObject函數。當我像下面一樣使用它時,它運行良好。如何將UserControl添加到其他UserControl?

<uc1:UC_Widget ID="UC_Widget1" runat="server"> 
    hello world 
</uc1:UC_Widget> 

但是,它出來一個問題:如果我想使用此控件包含另一個用戶控件, 如何爲這個做?許多thx!

<uc1:UC_Widget ID="UC_Widget1" runat="server"> 
hello world 
    <uc1:UC_Widget ID="UC_Widget2" runat="server"> 
    guy 
    </uc1:UC_Widget> 
</uc1:UC_Widget> 

thx Nix,我已經通過AddParsedSubObject方法解決了這個問題。

protected override void AddParsedSubObject(object obj) 
     { 
      if (this.HasControls()) 
      { 
       base.AddParsedSubObject(obj); 
      } 
      else if (obj is LiteralControl) 
      { 
       HtmlContent.Append(((LiteralControl)obj).Text); 
       this.Text = HtmlContent.ToString(); 
      } 
      else 
      { 
       string text1 = this.Text; 

       UC_eClinicWidget tmp = obj as UC_eClinicWidget; 
       if (tmp != null) 
       { 
        HtmlContent.Append(GetControlHtml(tmp)); 
        this.Text = HtmlContent.ToString(); 
       } 
      } 
     } 
+0

你得到了什麼錯誤? – Nix 2010-09-02 12:27:06

+0

Thx Nix,我得到這個錯誤,控件集合不能被修改,因爲控件包含代碼塊(即<% ... %>)。 而我執行AddParsedSubObject方法 – 2010-09-03 01:26:48

回答

0

雖然可能有更好的設計,但這仍然是可能的。

  1. 首先評估你不能拔出重複的部分。在你的例子中,你可以拉出的一段文字就是文字。如果你可以將你的控制分解成更小的部分,它將使你的整體設計更簡單。
  2. 確保您定義了停止條件。就像任何遞歸一樣,你必須讓它停止,否則你會得到堆棧溢出:)。

反例@湯姆佛沃特的鴿子

<asp:UpdatePanel> 
    <ContentTemplate> 
     <asp:UpdatePanel> 
      <ContentTemplate> 
       Hi there 
      </ContentTemplate> 
     </asp:UpdatePanel> 
    </ContentTemplate> 
</asp:UpdatePanel> 
0

這將導致一個無限循環......如果UC_Widget包含另一個UC_Widget,然後內UC_Widget也將包含UC_Widget等。你需要想出更好的設計。

+0

我不賣這個。可能不是最好的設計,但我認爲這是可能的。 – Nix 2010-09-02 12:28:00

相關問題