2009-03-04 79 views
2

我正在嘗試將模板添加到包含Label和TextBox的簡化組合控件。我想我的印記,最多是這個樣子:我怎樣纔能有一個ASP.NET模板複合控件?

<test:FormItem ID="fi" runat="server" Title="MyTitle" Text="My Text!"> 
    <TestTemplate> 
     <i> 
      <%# Container.Title) %></i> 
     <br /> 
     <%# Container.Text %> 
    </TestTemplate> 
</test:FormItem> 

我有了對TextBox和標籤性能的templateContainer類。

public class TemplateContainer : WebControl, INamingContainer 
{ 

    public TextBox Text { get { return m_item.Text; } } 
    public Label Title { get { return m_item.Title; } } 

    private FormItem m_item; 

    public TemplateContainer(FormItem item) 
    { 
     m_item = item; 
    } 

} 

在主FormItem類我有一個正在從的CreateChildControls(稱爲CreateControlHierarchy()方法):

protected virtual void CreateControlHierarchy() 
    { 

     m_itemTemplateContainer = new TemplateContainer(this); 
     TestTemplate.InstantiateIn(m_itemTemplateContainer); 

     Controls.Add(m_itemTemplateContainer); 

    } 

我要的是爲模板來呈現的實際控制。相反,它在控件上調用ToString()並顯示System.Web.UI.WebControls.Label和System.Web.UI.WebControls.TextBox。有沒有辦法讓模板添加控件到它的集合中,而不是隻在它們上調用ToString()?

注意:我也嘗試將文本框和標籤添加到容器的控件集合中,它執行相同的操作。

回答

1

好的。所以我嘗試了一些東西,並提出了一個合適的解決方案。

首先,我嘗試在數據綁定表達式中使用方法,然後跟蹤容器的Control集合中文本框或標籤的位置。但是,CompiledTemplateBuilder(這是.Net內部爲標記中指定的ITemplates構建的內容)將兩個綁定表達式之前和之後的所有標記放入一個DataBoundLiteral控件中,並且在調用該方法時已經創建了Control集合。

做了什麼工作就是創建一個新的WebControl,它用作組合控件中控件的佔位符。它有一個屬性Control,當它被設置時,它將控件添加到它的Controls集合中。

public class FormItemPlaceHolder : WebControl, INamingContainer 
{ 
    public WebControl Control 
    { 
     get 
     { 
      if(Controls.Count == 0) 
       return null; 
      return Controls[0] as WebControl; 
     } 
     set 
     { 
      if (Controls.Count != 0) 
       Controls.Clear(); 
      Controls.Add(value); 
     } 
    } 

} 

然後在標記,創建這種類型的控制,並將其綁定的控件屬性,在容器中的正確的屬性。

<test:FormItem ID="fi" runat="server" Title="MyTitle" Text="My Text!"> 
    <TestTemplate> 
     <i> 
     <test:FormItemPlaceHolder ID="ph" runat="server" 
      Control='<%# Container.Title %>' /> 
     </i> 
     <br /> 
     <test:FormItemPlaceHolder ID="ph2" runat="server" 
      Control='<%# Container.Text %>' /> 
    </TestTemplate> 
</test:FormItem> 

有沒有人有更好的解決方案?

0

容器不應該定義控件,只是數據。

在標記中,您應該定義數據的實際控制,並從容器中爲它們分配值。

E.g.

public class TemplateContainer : UserControl 
{ 
    public string Text { get { return m_text; } } 
    public string Title { get { return m_title; } } 

    private string m_text; 
    private string m_title; 
    private FormItem m_item; 

    public TemplateContainer(FormItem item) 
    { 
     m_item = item; 
    } 

} 

而在標記:

<test:FormItem ID="fi" runat="server" Title="MyTitle" Text="My Text!"> 
     <TestTemplate> 
      <i><asp:Label runat="server" Text='<%# Container.Title) %>' /></i> 
      <br /> 
      <asp:TextBox runat="server" Text='<%# Container.Text %>' /> 
    </TestTemplate> 
</test:FormItem> 

如果你想創建一個不需要標記添加控件複合控件,那麼你爲什麼要使用模板?如果只是爲了造型,那麼創建自己的Style對象可能更有效?

+0

我想創建一個複合控件(控件的控件)並允許用戶在控件周圍添加標記。注意:我不想創建一個UserControl。我有複合控件中控件的自定義邏輯,我希望它在各種應用程序中使用。 – rmw 2009-04-09 13:36:43