2010-12-02 21 views
6

este es un código de ejemplo de mi control de servidor personalizado:Enlace de datos de control personalizado con 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); 
    } 
} 

y aquí la implementación:

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

Mi etiqueta LabelInfo es accesible en el código detrás, gran !

Pero si uso mi control personalizado en un repetidor o un ListView, no puedo utilizar la propiedad Container.DataItem dentro de la plantilla 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> 

El mensaje de error:

'System.Web.UI.Control' no contiene una definición para 'DataItem' y no se pudo encontrar ningún método de extensión 'DataItem' que aceptara un primer argumento de tipo 'System.Web.UI.Control' (¿falta una directiva de uso? o una referencia de montaje?)

¿Cómo puedo usar la propiedad Container.DataItem dentro de la plantilla ContenuPrincipal de mi control?

Respuesta

4

he resuelto mi problema con una costumbre TemplateContainer heredar de IDataItemContainer:

public class BlocArrondiContainer : Panel, IDataItemContainer 

Cambio:

protected Panel _PanelContenuPrincipal = new Panel(); 

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

Por:

protected BlocArrondiContainer _PanelContenuPrincipal = new BlocArrondiContainer(); 

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

Overrinding el método OnDataBinding en la clase BlocArrondi:

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

     base.OnDataBinding(e); 
    } 
+0

Gran solución a su problema. Estaba llegando a casi lo mismo. –

Cuestiones relacionadas