2010-12-02 3 views
6

это образец кода моего пользовательского элемента управления сервера:Databinding на Custom Control с ITemplate

[Designer(typeof(ContainerControlDesigner))] 
[ToolboxData("<{0}:BlocArrondi runat=server><ContenuPrincipal></ContenuPrincipal></{0}:BlocArrondi>")] 
public class BlocArrondi : WebControl 
{ 
    private ITemplate _ContenuPrincipal; 
    protected Panel _PanelContenuPrincipal = new Panel(); 

    public BlocArrondi() 
    : base(HtmlTextWriterTag.Div) 
    { 

    } 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [TemplateInstance(TemplateInstance.Single)] 
    public ITemplate ContenuPrincipal 
    { 
      get { return _ContenuPrincipal; } 
      set { _ContenuPrincipal = value; } 
    } 

    protected override void OnInit(EventArgs e) 
    { 
      base.OnInit(e); 
      _PanelContenuPrincipal.ID = "PanelPrincipal"; 
      this.Controls.Add(_PanelContenuPrincipal); 

      if (_ContenuPrincipal != null) 
        _ContenuPrincipal.InstantiateIn(_PanelContenuPrincipal); 
    } 
} 

и здесь реализация:

<controls:BlocArrondi runat="server"> 
    <ContenuPrincipal> 
     <asp:Label id="LabelInfo" runat="server" /> 
    </ContenuPrincipal> 
</controls:BlocArrondi> 

Мой лейбл Labelinfo доступен на коде позади, большой !

Но если я использую мой пользовательский элемент управления в Repeater или ListView, я не могу использовать свойство Container.DataItem внутри ContenuPrincipal Шаблон:

<asp:Repeater id="RepeaterInfos" runat="server"> 
    <ItemTemplate> 
     <controls:BlocArrondi runat="server"> 
      <ContenuPrincipal> 
       <asp:Label runat="server" Text="<%# (Container.DataItem as MsgInfo).DisplayMessage() " /> 
      </ContenuPrincipal> 
     </controls:BlocArrondi> 
    </ItemTemplate> 
</asp:Repeater> 

Сообщение об ошибке:

«System.Web.UI.Control» не содержит определения для «DataItem» и не используется метод расширения «DataItem», принимающий первый аргумент типа «System.Web.UI.Control» (вам не хватает директивы using или ссылку на сборку?)

Как я могу использовать свойство Container.DataItem внутри ContenuPrincipal Template моего элемента управления?

ответ

4

я решить мою проблему с обычаем TemplateContainer наследоваться от класса IDataItemContainer:

public class BlocArrondiContainer : Panel, IDataItemContainer 

Изменения:

protected Panel _PanelContenuPrincipal = new Panel(); 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [TemplateInstance(TemplateInstance.Single)] 
    public ITemplate ContenuPrincipal 
    { 
     get { return _ContenuPrincipal; } 
     set { _ContenuPrincipal = value; } 
    } 

By:

protected BlocArrondiContainer _PanelContenuPrincipal = new BlocArrondiContainer(); 

    [PersistenceMode(PersistenceMode.InnerProperty)] 
    [TemplateInstance(TemplateInstance.Single)] 
    [TemplateContainer(typeof(BlocArrondiContainer))] 
    public ITemplate ContenuPrincipal 
    { 
     get { return _ContenuPrincipal; } 
     set { _ContenuPrincipal = value; } 
    } 

Overrinding метода OnDataBinding на классе BlocArrondi:

protected override void OnDataBinding(System.EventArgs e) 
    { 
     if (NamingContainer is IDataItemContainer) 
      _PanelContenuPrincipal.DataItem = (NamingContainer as IDataItemContainer).DataItem; 

     base.OnDataBinding(e); 
    } 
+0

Отличное решение вашей проблемы. Я приближался почти к тому же. – 2010-12-02 15:01:15