2009-03-04 2 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> 

У меня есть класс templateContainer, который имеет свойства для TextBox и Label.

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 у меня есть метод CreateControlHierarchy(), который вызывается из CreateChildControls():

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

Хорошо. Поэтому я попробовал несколько вещей, и я придумал решение OK.

Во-первых, я попытался использовать методы в выражении привязки данных, а затем отслеживать, где в коллекции управления контейнером будет отображаться текстовое поле или ярлык. Тем не менее, 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); 
     } 
    } 

} 

Затем, создавая элемент управления этим типом и привязывая его свойство Control к правильному свойству в контейнере.

<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> 

Если вы пытаетесь создать составной элемент управления, который не требует управления, которые будут добавлены в разметке, то почему вы используете шаблон? Если это просто для стилизации, то, возможно, создание собственного объекта стиля может быть более эффективным?

+0

Я хочу создать составной элемент управления (управление элементами управления) и позволить пользователю добавлять разметку вокруг элементов управления. Примечание. Я не хочу создавать UserControl. У меня есть пользовательская логика для элементов управления в Composite Control, и я хочу, чтобы она использовалась в разных приложениях. – rmw

+0

У вас должен быть возможность самостоятельно перемещать фактические элементы управления или просто размещать разметку до и после них? – codemonkeh

Смежные вопросы