【问题标题】:ASP.NET create repeater programmaticallyASP.NET 以编程方式创建转发器
【发布时间】:2012-01-01 18:43:25
【问题描述】:

我正在尝试以编程方式创建 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")

【问题讨论】:

  • 首先,您应该将数据分配给tablaCarpetas;然后,将代码 .cs 和代码 .aspx 分开。页眉、页脚和项目模板应在代码.aspx 中使用。

标签: asp.net repeater


【解决方案1】:

我不太确定是否使用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()

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

【讨论】:

  • 就是这样,显然以编程方式填充模板元素的唯一方法是实现 ITemplate 类。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-06-06
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多