ASP.NET以编程方式创建转发器

时间:2012-01-01 18:43:25

标签: asp.net repeater

我正在尝试以编程方式创建ASP:Repeater,我在尝试绑定列时遇到问题。我读过的教程非常令人困惑,其中很多都没有达到约束力。

我的问题只是在绑定数据时,我会在“静态”转发器中写这个:

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

我不知道在代码隐藏工作时应该是什么,它在一个类中,所以我没有事件处理程序。到目前为止,这是我的代码:

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)

我应该写什么而不是DataBinder.Eval(Container.DataItem, "Name")

1 个答案:

答案 0 :(得分:5)

我不太确定使用TemplateBuilder因为它是用于ASP.NET框架的消费,并且没有太多可用的文档。但是,您可以尝试更改以下行

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

另一种方法是构建自己的模板控件 - 例如

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

免责声明:未经测试的代码 - 只是为了让您了解如何动态构建模板并通过捕获数据绑定事件来管理数据绑定。