Change repeater li item class if first or last

前端 未结 10 2124
时光说笑
时光说笑 2020-12-05 07:11

I\'m using repeater to create dynamic ul li list

Is it possible to control class whether item is first or last?

Something like:

class=\"<%         


        
相关标签:
10条回答
  • 2020-12-05 07:19

    If possible, I'd recommend using something like jQuery for this as it makes implementing this type of functionality very easy. For example, you could have something like this:

    <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");
    
    0 讨论(0)
  • 2020-12-05 07:19

    For those needing this in VB, here's what works for me.

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

    I needed a divider to show for all items except for the last one.

    0 讨论(0)
  • 2020-12-05 07:22

    I modified nelsestu's solution and came up with:

    <%# Container.ItemIndex == ((System.Data.DataTable)((Repeater)Container.Parent).DataSource).Rows.Count-1 ? "</div>" : string.Empty %>
    
    0 讨论(0)
  • 2020-12-05 07:24

    It is quite easy to determine whether the item is first or not (Container.ItemIndex == 0), but to determine whether the element is last or not you have to use a custom property which will be initialized right with data binding:

    protected int ItemCount { get; set; }
    

    Here is a repeater example:

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

    here is an example of data binding:

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

    and finally a helper method:

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

    This will produce:

    <ul>
        <li class="first">
            first
        </li>
        <li class="other">
            second
        </li>
        <li class="last">
            third
        </li>
    </ul>
    
    0 讨论(0)
  • 2020-12-05 07:27

    I usually do it like this for the last item

     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
    

    and here is how I use it in HTML markup

     <div <%# IIf(m_recordCount - 1 = Container.ItemIndex, "class='clearBorder'", "")%>>
    
    0 讨论(0)
  • 2020-12-05 07:28

    I wasn't able to use Alex's answer directly. Here are the modifications I made that worked for me. Using Alex's "repeater example" for the asp:Repeater tag, use this in the code behind:

    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";
    }
    
    0 讨论(0)
提交回复
热议问题