【问题标题】:.NET Repeater HeaderTemplate.NET 中继器标头模板
【发布时间】:2010-12-01 00:36:55
【问题描述】:
有没有办法在标头模板中访问数据绑定转发器的字段标头名称。因此,这个....
<HeaderTemplate>
<table >
<th ></th>
<th >Forename</th>
<th >Surname</th>
<th >work email</th>
<th ></th>
</HeaderTemplate>
We get something like this.
<HeaderTemplate>
<table >
<th ></th>
<th ><%# Eval("Forename").HeaderName%></th>
<th ><%# Eval("SureName").HeaderName%></th>
<th ><%# Eval("WorkEmail").HeaderName%></th>
<th ></th>
</HeaderTemplate>
【问题讨论】:
标签:
c#
.net
asp.net
vb.net
【解决方案1】:
您不能在 HeaderTemplate 中使用 <%# %> 语法,因为它不在数据绑定方案中。但是,您应该能够使用<%= %>,然后在您的页面/用户控件上放置一些方法来返回标题。
【解决方案2】:
您可以像这样将表头移动到您的 ItemTemplate 中:
<ItemTemplate>
<asp:Panel runat="server" Visible='<%# Container.DisplayIndex == 0 %>'>
<tr>
<th><%# Eval("Forename").HeaderName %></th>
</tr>
</asp:Panel>
<tr>
<td><%# Eval("Forename") %></td>
</tr>
</ItemTemplate>
虽然这有点浪费,因为每行都会绑定标题(虽然只显示了第一行)。也许使用 而不是 Panel 会更好,但我不知道如何在该上下文中访问 Container.DisplayIndex。
编辑:
在 .net 4.5 Container.DisplayIndex 中不起作用;替换为Container.ItemIndex。
完整示例:
<ItemTemplate>
<asp:Panel runat="server" Visible='<%# Container.ItemIndex == 0 %>'>
<tr>
<th><%# Eval("Forename").HeaderName %></th>
</tr>
</asp:Panel>
<tr>
<td><%# Eval("Forename") %></td>
</tr>
</ItemTemplate>
【解决方案3】:
尝试在标头模板中执行 Eval("Field").Property 会引发空异常。
我会做这样的事情......
背后的代码
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
List<SomeData> data = new List<SomeData>();
data.Add(new SomeData("Bob"));
data.Add(new SomeData("Joe"));
Repeater1.DataSource = data;
Repeater1.DataBind();
}
public String FirstnameColumn {
get { return "Firstname"; }
}
}
public class SomeData
{
public String Firstname { get; set; }
public SomeData(String firstname) {
this.Firstname = firstname;
}
}
标记
<table>
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<tr><td><%= FirstnameColumn %></td></tr>
</HeaderTemplate>
<ItemTemplate>
<tr><td><%# Eval("Firstname") %></td></tr>
</ItemTemplate>
</asp:Repeater>
</table>
【解决方案4】:
为什么不使用已在 RepeaterEvents 中找到的项目类型?
protected void rptContent_DataBound(object Sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Header)
{
var x= e.Item.FindControl("xxx") as Label;
...
}
}