2010-09-02 8 views
1

У меня есть UserControl, называемый UC_Widget, он наследуется от 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

+0

Thx Nix, я получил эту ошибку, коллекция Controls не может быть изменена, потому что элемент управления содержит блоки кода (т. Е. <% ... %>). пока я выполняю метод AddParsedSubObject –

ответ

0

Хотя, вероятно, лучший дизайн, это все еще возможно.

  1. Сначала оцените, что вы не можете вытащить кусок, который повторяется. В вашем примере часть, которую вы могли бы вытащить, - это текст. Если вы можете разбить свой контроль на более мелкие кусочки, это сделает ваш общий дизайн менее сложным.
  2. Убедитесь, что вы определили условие остановки. Как и при любой рекурсии, вы должны остановить ее или получить переполнение стека :).

контрпример к @tom Vervoort

<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