如果是第一个或最后一个,更改转发器li项目类

时间:2011-03-10 17:53:50

标签: c# .net asp.net

我正在使用转发器来创建动态ul列表

是否可以控制类是第一个还是最后一个?

类似的东西:

class="<%# if(Container.ItemIndex == 0)
   {
        class = ... 
   }
   ) %>"

顺便说一下它的真正含义:ASP.NET中的<%#

<%#<%=之间有什么区别?

10 个答案:

答案 0 :(得分:56)

确定项目是否为第一项(Container.ItemIndex == 0)非常容易,但要确定该元素是否为最后一项,您必须使用将使用数据绑定进行初始化的自定义属性:

protected int ItemCount { get; set; }

以下是转发器示例:

<asp:Repeater runat="server" ID="repeater">
    <HeaderTemplate>
        <ul>
    </HeaderTemplate>
    <ItemTemplate>
        <li class="<%# GetItemClass(Container.ItemIndex) %>">
            <%# Container.DataItem %>
        </li>
    </ItemTemplate>
    <FooterTemplate>
        </ul>
    </FooterTemplate>
</asp:Repeater>

这是一个数据绑定的例子:

public override void DataBind()
{
    var data = new string[] { "first", "second", "third" };
    this.ItemCount = data.Length;

    repeater.DataSource = data;
    repeater.DataBind();
}

最后是辅助方法:

protected string GetItemClass(int itemIndex)
{
    if (itemIndex == 0)
        return "first";
    else if (itemIndex == this.ItemCount - 1)
        return "last";
    else
        return "other";
}

这将产生:

<ul>
    <li class="first">
        first
    </li>
    <li class="other">
        second
    </li>
    <li class="last">
        third
    </li>
</ul>

答案 1 :(得分:40)

我通常使用以下内容:

<asp:Repeater ID="rptItems" runat="server" ViewStateMode="Disabled">
  <ItemTemplate>
    <li<%# Container.ItemIndex == ((IList)((Repeater)Container.Parent).DataSource).Count-1 ? " class='last'" : ""%>>
...
    </li>
  </ItemTemplate>
</asp:Repeater>

答案 2 :(得分:6)

如果可能的话,我建议使用像jQuery这样的东西,因为它可以很容易地实现这种类型的功能。例如,你可以这样:

<asp:Repeater id="MyRepeater" runat="server">
    <HeaderTemplate><table class="MyRepeater"></HeaderTemplate>
    <FooterTemplate></table></FooterTemplate>
    <ItemTemplate><tr><td>My Data</td></tr></ItemTemplate>
</asp:Repeater>

$("table.MyRepeater tr:last").attr("class", "last");

答案 3 :(得分:3)

如果您不使用jQuery,请尝试这样的事情

 <asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <asp:Label ID="Label1" CssClass='<%# Container.ItemIndex == 0 ? "first" : "notFirst" %>' runat="server" Text="Label"></asp:Label>
    </ItemTemplate>
    </asp:Repeater>

答案 4 :(得分:2)

我修改了nelsestu的解决方案并提出了:

<%# Container.ItemIndex == ((System.Data.DataTable)((Repeater)Container.Parent).DataSource).Rows.Count-1 ? "</div>" : string.Empty %>

答案 5 :(得分:1)

关于&lt;%=和&lt;%#之间差异的问题,请参阅以下链接:

代码渲染块:

http://msdn.microsoft.com/en-us/library/k6xeyd4z(v=vs.71).aspx

数据绑定表达式语法:

http://msdn.microsoft.com/en-us/library/bda9bbfx(v=vs.71).aspx

答案 6 :(得分:1)

我无法直接使用Alex的答案。以下是我所做的修改对我有用。使用Alex的“转发器示例”作为asp:Repeater标签,在后面的代码中使用它:

private string[] data = new string[] { "first", "second", "third" };
protected int ItemCount { get; set; }

private void Page_Load(object sender, EventArgs e)
{
    // normally one would fetch the data here right before binding like this:
    // data = SomeService.SomeMethodToGetData();
    repeater.DataSource = data;
    repeater.DataBind();
}

public override void DataBind()
{
    ItemCount = data.Count();
}

protected string GetItemClass(int itemIndex)
{
    if (itemIndex == 0)
        return "first";
    else if (itemIndex == this.ItemCount - 1)
        return "last";
    else
        return "other";
}

答案 7 :(得分:0)

我通常会为最后一项

这样做
 Public m_recordCount As Integer
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ltrlTitle.Text = m_title

    Using Context As New MyEntities
        Dim m_lst = Context.getHotRecords(m_location).ToList
        m_recordCount = m_lst.count()

        rptListings.DataSource = m_lst
        rptListings.DataBind()
    End Using

End Sub

以下是我在HTML标记中使用它的方法

 <div <%# IIf(m_recordCount - 1 = Container.ItemIndex, "class='clearBorder'", "")%>>

答案 8 :(得分:0)

对于那些在VB中需要这个的人来说,这对我有用。

<span runat="server" class='divider' 
    Visible="<%# Container.ItemIndex < DirectCast(DirectCast(Container.Parent,Repeater).DataSource,List(Of IList)).Count()-1 %>">|</span>

我需要一个分隔符来显示除最后一个项目之外的所有项目。

答案 9 :(得分:0)

如果您在ItemTemplate中使用控件,则可以执行以下操作,添加 OnItemDataBound 事件。

<asp:Repeater ID="RptId" runat="server" OnItemDataBound="OnItemDataBound">
  <ItemTemplate>
    <asp:Panel runat="server" ID="PnlCtrlItem">
      <%#Eval("Content") %>
    </asp:Panel>
  </ItemTemplate>
</asp:Repeater>

protected void OnItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemIndex == 0)
      ((Panel) e.Item.FindControl("PnlCtrlItem")).CssClass = "first";
    //or the following to have your control indexed
    ((Panel) e.Item.FindControl("PnlCtrlItem")).CssClass = string.Format("item-{0}",e.Item.ItemIndex);
}