repeater填充html,使用动态绑定到对象列表的ASP.NET Repeater创建HtmlTable

我以编程方式在中继器内创建一个表。我的问题是,项目模板部分中的单元格无法正确呈现。它们在表格标记后显示为文本节点。有没有人有关于如何正确获取表格单元格的建议?

using System;

using System.Collections.Generic;

using System.Web.UI;

using System.Web.UI.HtmlControls;

using System.Web.UI.WebControls;

namespace WebApplication1

{

public partial class WebForm2 : Page

{

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

var dogs = new List

{

new Dog { Name = "Rex", Breed = "Russell Terrier" },

new Dog { Name = "Fido", Breed = "Poodle" },

new Dog { Name = "Fetcher", Breed = "Golden Retriever" },

};

var repeater = new Repeater { ID = "Repeater1" };

repeater.DataSource = dogs;

repeater.DataBind();

AddHeader(repeater);

AddItems(repeater, dogs);

PlaceHolder1.Controls.Add(repeater);

}

}

private void AddHeader(Repeater repeater)

{

var repeaterItem = new RepeaterItem(0, ListItemType.Header);

var table = new HtmlTable();

var row = new HtmlTableRow();

var cell1 = new HtmlTableCell("th") { InnerText = "Name" };

var cell2 = new HtmlTableCell("th") { InnerText = "Breed" };

row.Cells.Add(cell1);

row.Cells.Add(cell2);

table.Rows.Add(row);

repeaterItem.Controls.Add(table);

repeater.Controls.Add(repeaterItem);

}

private void AddItems(Repeater repeater, List dogs)

{

for (var i = 0; i < repeater.Items.Count; i++)

{

var repeaterItem = new RepeaterItem(i + 1, ListItemType.Item);

var row = new HtmlTableRow();

var cell1 = new HtmlTableCell() { InnerText = dogs[i].Name };

var cell2 = new HtmlTableCell() { InnerText = dogs[i].Breed };

row.Cells.Add(cell1);

row.Cells.Add(cell2);

repeaterItem.Controls.Add(row);

repeater.Controls.Add(repeaterItem);

}

}

private sealed class Dog

{

public string Breed { get; set; }

public string Name { get; set; }

}

}

}更新:感谢Rob的帮助,我能够使代码工作。现在我有一个全功能的Repeater被完全加载到代码隐藏的数据绑定中。太好了!

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web.UI;

using System.Web.UI.HtmlControls;

using System.Web.UI.WebControls;

using ExtensionMethods.WebControls;

namespace WebApplication1

{

public partial class WebForm1 : Page

{

protected void Page_Load(object sender, EventArgs e)

{

var dogs = new List

{

new Dog { Name = "Rex", Breed = "Russell Terrier" },

new Dog { Name = "Fido", Breed = "Poodle" },

new Dog { Name = "Fetcher", Breed = "Golden Retriever" },

};

var repeater = new Repeater

{

ID = "Repeater1",

HeaderTemplate = new CustomTemplate(ListItemType.Header),

ItemTemplate = new CustomTemplate(ListItemType.Item),

FooterTemplate = new CustomTemplate(ListItemType.Footer),

DataSource = dogs

};

repeater.DataBind();

PlaceHolder1.Controls.Add(repeater);

}

// Custom template class to add controls to the repeater's header, item and footer sections.

private sealed class CustomTemplate : ITemplate

{

private ListItemType ListItemType { get; set; }

public CustomTemplate(ListItemType type)

{

ListItemType = type;

}

public void InstantiateIn(Control container)

{

if (ListItemType == ListItemType.Header)

{

var table = new LiteralControl();

var head = new HtmlGenericControl("thead");

var row = new HtmlTableRow();

row.Cells.Add(new HtmlTableCell("th") { InnerText = "Breed" });

row.Cells.Add(new HtmlTableCell("th") { InnerText = "Name" });

head.Controls.Add(row);

table.Text = string.Format("

container.Controls.Add(table);

}

else if (ListItemType == ListItemType.Item)

{

var row = new HtmlTableRow();

var cell1 = new HtmlTableCell();

cell1.Controls.Add(new Literal { ID = "LiteralBreed" });

row.Cells.Add(cell1);

var cell2 = new HtmlTableCell();

cell2.Controls.Add(new Literal { ID = "LiteralName" });

row.Cells.Add(cell2);

container.Controls.Add(row);

container.DataBinding += new EventHandler(Container_DataBinding);

}

else if (ListItemType == ListItemType.Footer)

{

var footer = new LiteralControl("

");

container.Controls.Add(footer);

}

}

// Event handler to populate the dog's breed and name in the table when data-binding occurs.

private void Container_DataBinding(object sender, EventArgs e)

{

var item = sender as RepeaterItem;

if (item != null)

{

var dog = ((Dog)item.DataItem);

var breed = item.FindDescendantsByType().Single(x => x.ID == "LiteralBreed");

breed.Text = dog.Breed;

var name = item.FindDescendantsByType().Single(x => x.ID == "LiteralName");

name.Text = dog.Name;

}

}

}

private sealed class Dog

{

public string Breed { get; set; }

public string Name { get; set; }

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值