2010-09-02 138 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

相关问题