2010-12-02 11 views
6

dies ist ein Beispielcode von meiner benutzerdefinierten Server-Steuerung:Datenbindung auf Custom Control mit 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); 
    } 
} 

und hier ist die Umsetzung:

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

My Label Labelinfo ist zugänglich auf der Code-behind, groß !

Aber wenn ich meine individuelle Steuerung in einem Repeater oder einem Listview verwenden, kann ich nicht die Container.DataItem Eigenschaft innerhalb der ContenuPrincipal Vorlage verwenden:

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

Die Fehlermeldung:

'System.Web.UI.Control' enthält keine Definition für 'DataItem' und es wurde keine Erweiterungsmethode 'DataItem' gefunden, die ein erstes Argument vom Typ 'System.Web.UI.Control' akzeptiert (fehlt eine using-Direktive) oder eine Baugruppenreferenz?)

Wie kann ich die Container.DataItem-Eigenschaft innerhalb der ContenuPrincipal-Vorlage meines Steuerelements verwenden?

Antwort

4

I Mein Problem wurde gelöst mit einem benutzerdefinierten von IDataItemContainer TemplateContainer erben:

public class BlocArrondiContainer : Panel, IDataItemContainer 

Wechsel:

protected Panel _PanelContenuPrincipal = new Panel(); 

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

Von:

protected BlocArrondiContainer _PanelContenuPrincipal = new BlocArrondiContainer(); 

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

die OnDataBinding Methode auf der BlocArrondi Klasse Overrinding:

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

     base.OnDataBinding(e); 
    } 
+0

Große Lösung für Ihr Problem. Ich kam fast zur selben Zeit. –