请教:如何在repeater中动态生成模板。
根据用户要求要动态的生成模板。模板个数不定,所以不能在HTML中固定这样的绑定:
<%# DataBinder.Eval(Container.DataItem, "ID")%>
在网上查了查大有些DATAGRID的例子。但是相对repeater还是有些区别。
特别是:
http://dotnet.aspx.cc/ShowDetail.aspx?id=B131BF6E-B35B-413C-9DCE-E755242FA795
兄弟看了想换成rapeater还是困难,所以向大家请教。。最好求些例子。我的愿意是在这里绑定:很显然我的想法完全错误。这些绑定的结果只是客户端HTML而已。
private void Repeater1_ItemCreated(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
{
HtmlTableCell cell  = (HtmlTableCell)e.Item.FindControl("tdd");
if(cell != null)
{
HtmlTable t = new HtmlTable();
HtmlTableRow tr = new HtmlTableRow();
for (int i=0;i<Num;i++)
{
HtmlTableCell td = new HtmlTableCell();
td.Width = (100/Num).ToString()+"%";
td.Align="Conter";
td.InnerHtml = "<%# DataBinder.Eval(Container.DataItem, \""+arr[i]+"\")%>";
tr.Cells.Add(td);
t.Rows.Add(tr);
}
cell.Controls.Add(t);
}

}
}

解决方案 »

  1.   

    实现ITemplate
    如果你想完全地在内存中创建一个的模板,你不得不首先编码,然后实例化一个类,该类实现ITemplate接口. ITemplate接口只有一个方法,名为InstantiateIn. asp.net中所有具有template属性的服务器控件都通过这个属性暴露实现了ITemplate接口的类.这个接口简单地定义了用于组合与模板一致的子控件的实例的方法来填充容器控件.图11演示了实现itemplate接口大部分的代码,它为一个datagrid在内存中创建了一个的模板列.同样,也可以把这些代码用于datalist和repeater控件中。唯一不同的是在OnDataBinding事件处理上。类的结构你可以写成类似下面:
    class LastFirstNameTemplate : ITemplate
    {
      public void InstantiateIn(Control container) 
      {...}  private void BindLastName(Object s, EventArgs e)
      {...}  private void BindFirstName(Object s, EventArgs e)
      {...}
    }Figure 11 In-memory Templated Column 
    // 动态的创建模板列函数
    public void AddTemplateColumnFromITemplate(String strHeader)
    {
        TemplateColumn bc = new TemplateColumn();
        bc.HeaderText = strHeader;
        bc.ItemTemplate = new LastFirstNameTemplate();
        grid.Columns.Add(bc);
    }// 这个类实现了一个自定义模板。新控件与容器本身的控件组合创建一个新的模板类,如// 果控件要绑定数据,你可以注册你自己的绑定处理事件(OnDataBinding事件)
    public class LastFirstNameTemplate : ITemplate
    {    // Instantiate the elements of the template in the given
        // container. In this case, a DataGridItem element.    public void InstantiateIn(Control container) 
        {
            container.Controls.Add(new LiteralControl("<b>"));        Label lblLastName = new Label();
            lblLastName.DataBinding += new EventHandler(this.BindLastName);
            container.Controls.Add(lblLastName);        container.Controls.Add(new LiteralControl("</b>, "));        Label lblFirstName = new Label();
            lblFirstName.DataBinding += new EventHandler(this.BindFirstName);
            container.Controls.Add(lblFirstName);
        }    // Handler of the OnDataBinding event for the Label element
        // that renders the lastname column in the template.    private void BindLastName(Object sender, EventArgs e)
        {
                Label l = (Label) sender;
                DataGridItem container = (DataGridItem) l.NamingContainer;
                l.Text = ((DataRowView)container.DataItem)
                    ["lastname"].ToString();
        }    // Handler of the OnDataBinding event for the Label element
        // that renders the firstname column in the template.    private void BindFirstName(Object sender, EventArgs e)
        {
                Label l = (Label) sender;
                DataGridItem container = (DataGridItem) l.NamingContainer;
                l.Text = ((DataRowView)container.DataItem)
                    ["firstname"].ToString();
        }
    }
      

  2.   

    请教:如何在repeater中动态生成模板。
    根据用户要求要动态的生成模板。模板个数不定,所以不能在HTML中固定这样的绑定:
    <%# DataBinder.Eval(Container.DataItem, "ID")%>
    在网上查了查大有些DATAGRID的例子。但是相对repeater还是有些区别。
    特别是:
    http://dotnet.aspx.cc/ShowDetail.aspx?id=B131BF6E-B35B-413C-9DCE-E755242FA795
    兄弟看了想换成rapeater还是困难,所以向大家请教。。最好求些例子。我的愿意是在这里绑定:很显然我的想法完全错误。这些绑定的结果只是客户端HTML而已。
    private void Repeater1_ItemCreated(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
    {
    if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem)
    {
    HtmlTableCell cell  = (HtmlTableCell)e.Item.FindControl("tdd");
    if(cell != null)
    {
    HtmlTable t = new HtmlTable();
    HtmlTableRow tr = new HtmlTableRow();
    for (int i=0;i<Num;i++)
    {
    HtmlTableCell td = new HtmlTableCell();
    td.Width = (100/Num).ToString()+"%";
    td.Align="Conter";
    td.InnerHtml = "<%# DataBinder.Eval(Container.DataItem, \""+arr[i]+"\")%>";
    tr.Cells.Add(td);
    t.Rows.Add(tr);
    }
    cell.Controls.Add(t);
    }

    }
    }
      

  3.   

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vbtchtopquestionsaboutaspnetdatagridservercontrol.asp
      

  4.   

    还是想找个repeater的例子。先参考了。
      

  5.   

    干脆不要repeater了,直接写个函数输出html
    我就是这样干的
      

  6.   

    leisang(我自飘零) 
    兄台请细细说来!
      

  7.   

    就是放一个label在页面上,然后往里面写html就是了,最灵活的方法,不过写起来够累。
      

  8.   

    用原始的方法吧!):
    asp里的循环读取然后自己写出来!
      

  9.   

    zhanqiangz(闲云野鹤)  
       用原始的方法吧!):
    asp里的循环读取然后自己写出来!说实话ASP我只是能改改。兄台能不能把思路说说。。我是用孟老大的http://dotnet.aspx.cc/ShowDetail.aspx?id=B131BF6E-B35B-413C-9DCE-E755242FA795方法。做了。。  
     
      

  10.   

    实现ITemplate接口.下文提供了如何在DataGrid里面动态添加模板列的方法希望有所帮助!
    http://www.c-sharpcorner.com/Code/2003/June/AddItemTemplateDynamically.asp