.NET Repeater HeaderTemplate

Ant*_*ney 8 .net c# vb.net asp.net

有没有办法在标题模板中访问数据绑定中继器的字段标题名称.所以这个......

                      <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>
Run Code Online (Sandbox Code Playgroud)

小智 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

标记

<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>
Run Code Online (Sandbox Code Playgroud)


Per*_*ahl 5

您可以将表标题移动到 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>
Run Code Online (Sandbox Code Playgroud)

尽管这有点浪费,因为标题将绑定到每一行(尽管仅显示第一行)。也许使用 <% if (...) %> 而不是面板会更好,但我不知道如何在该上下文中访问 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>
Run Code Online (Sandbox Code Playgroud)