2012-01-01 3 views
1

J'essaye de créer un ASP: Repeater par programme et j'ai un problème en essayant de lier les colonnes. Les tutoriels que j'ai lus sont assez confus et beaucoup d'entre eux ne vont pas au point de liaison.ASP.NET créer un répéteur par programme

Mon problème est que dans le point de liaison de données, quand j'écrire cela dans un répéteur « statique »:

<%# DataBinder.Eval(Container.DataItem, "Name")%> 

Je ne sais pas ce qui devrait être lorsque vous travaillez dans le code-behind, il est dans une classe, donc je n'ai pas de gestionnaire d'événements. Ceci est mon code à ce jour:

Dim DsArbol As New SqlDataAdapter(query, System.Configuration.ConfigurationManager.ConnectionStrings("CNX").ConnectionString) 

    Dim tablaCarpetas As New DataTable 
    DsArbol.Fill(tablaCarpetas) 

    Dim RepArbol As New Repeater 
    RepArbol.DataSource = tablaCarpetas 
    RepArbol.ID = "repArbolCarpetas" 

    Dim header As New TemplateBuilder 
    Dim item As New TemplateBuilder 
    Dim footer As New TemplateBuilder 

    header.AppendLiteralString("<ul class=""arbol-carpetas"">") 
    item.AppendLiteralString(String.Format("<li id=""li_carpeta_{0}"">{1}</li>", 1, DataBinder.Eval(Container.DataItem, "Name"))) 
    footer.AppendLiteralString("</ul>") 

    RepArbol.HeaderTemplate = header 
    RepArbol.ItemTemplate = item 
    RepArbol.FooterTemplate = footer 

    RepArbol.DataBind() 
    PanelArbolCarpetas.Controls.Add(RepArbol) 

Que dois-je écrire au lieu de DataBinder.Eval(Container.DataItem, "Name")?

+0

Tout d'abord, vous devez affecter des données à tablaCarpetas; Ensuite, séparez le code .cs et le code .aspx. L'en-tête, le pied de page et le modèle d'élément doivent être utilisés dans le code .aspx. –

Répondre

5

Je ne suis pas sûr d'utiliser TemplateBuilder car il est destiné à la consommation pour le framework ASP.NET et il n'y a pas beaucoup de documentation disponible. Cependant, vous pouvez essayer de changer sous la ligne comme

item.AppendLiteralString("<li id=\"li_carpeta_1\"><%# Eval(\"Name\") %></li>") 

La méthode alternative est de construire votre propre contrôle de modèle - par exemple

public class MyTemplate : ITemplate 
{ 
    ListItemType _type; 

    public MyTemplate(ListItemType type) 
    { 
    _type = type; 
    } 

    public void InstantiateIn(Container control) 
    { 
     switch(_type) 
     { 
     case ListItemType.Header: 
      control.Contorls.Add(new LiteralControl("<ul class=\"arbol-carpetas\">")); 
      break; 

     case ListItemType.Footer: 
      control.Contorls.Add(new LiteralControl("</ul>")); 
      break; 

     case ListItemType.Item: 
     case ListItemType.AlternatingItem: 
      var c = new GenericHtmlControl("<li>"); 
      c.ID = "L"; 
      ... // add needed attributes etc. 
      container.Controls.Add(c); 
      // manage data binding 
      container.DataBinding += (o,e) => 
       { 
       c.InnerText = DataBinder.Eval(Container, "Name"); 
       }; 
      break; 
     } 
    } 
} 

    RepArbol.HeaderTemplate = new MyTemplate(ListItemType.Header); 
    RepArbol.ItemTemplate = MyTemplate(ListItemType.Item); 
    RepArbol.FooterTemplate = MyTemplate(ListItemType.Footer); 
    RepArbol.DataBind() 

Responsabilité: code non testé - juste pour vous donner une idée Construire dynamiquement un modèle et gérer la liaison de données en capturant l'événement de liaison de données.

+0

C'était comme ça, apparemment la seule façon de remplir les éléments structurés est de mettre en application la classe ITemplate. Je vous remercie –