有没有办法在标题模板中访问数据绑定中继器的字段标题名称。所以这就是......
<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>
答案 0 :(得分:9)
尝试在标题模板中执行 Eval(“Field”)。属性会抛出一个空异常。
我会做这样的事......
背后的代码
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>
答案 1 :(得分:4)
您可以将表头移动到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>
虽然这有点浪费,因为标题将被绑定到每一行(虽然只显示了第一行)。也许最好使用&lt;%if(...)%&gt;而不是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>
答案 2 :(得分:3)
您不能在HeaderTemplate中使用<%# %>
语法,因为它不在数据绑定方案中。但是,您应该可以使用<%= %>
,然后在页面/ usercontrol上放置一些返回Header的方法。
答案 3 :(得分:1)
为什么不使用已在RepeaterEvents中找到的项目类型?
protected void rptContent_DataBound(object Sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Header)
{
var x= e.Item.FindControl("xxx") as Label;
...
}
}