.NET Repeater HeaderTemplate

时间:2009-09-24 08:49:46

标签: c# .net asp.net vb.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>

4 个答案:

答案 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;
             ...
        }
    }