Cambia la clase de ítem repetidor li si es el primero o el último

Estoy usando el repetidor para crear una lista dinámica de ul li

¿Es posible controlar la clase si el artículo es el primero o el último?

Algo como:

class="" 

por cierto, ¿qué significa realmente: <%# en ASP.NET

¿Cuál es la diferencia entre <%# y <%= ?

Es bastante fácil determinar si el elemento es primero o no ( Container.ItemIndex == 0 ), pero para determinar si el elemento es el último o no, debe usar una propiedad personalizada que se inicializará correctamente con el enlace de datos:

 protected int ItemCount { get; set; } 

Aquí hay un ejemplo de repetidor:

   
  • <%# Container.DataItem %>
  • Aquí hay un ejemplo de enlace de datos:

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

    y finalmente un método de ayuda:

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

    Esto producirá:

     
    • first
    • second
    • third

    Normalmente uso algo como lo siguiente:

       > ...    

    Si es posible, recomendaría usar algo como jQuery para esto, ya que hace que la implementación de este tipo de funcionalidad sea muy fácil. Por ejemplo, podrías tener algo como esto:

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

    Prueba algo así, si no estás usando jQuery

           

    Modifiqué la solución de nelsestu y encontré:

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

    En cuanto a su pregunta sobre la diferencia entre <% = y <% #, consulte los siguientes enlaces:

    Código de bloques de procesamiento:

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

    Sintaxis de expresión de enlace de datos:

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

    No pude usar la respuesta de Alex directamente. Aquí están las modificaciones que hice que funcionaron para mí. Usando el “ejemplo de repetidor” de Alex para la etiqueta asp: Repeater, use esto en el código que se encuentra detrás:

     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"; } 

    Normalmente lo hago así para el último artículo.

      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 

    Y aquí es como lo uso en el marcado HTML.

      
    >

    Para aquellos que necesitan esto en VB, esto es lo que funciona para mí.

     | 

    Necesitaba un divisor para mostrar todos los artículos excepto el último.

    Si está usando controles dentro de su ItemTemplate, puede hacer algo como lo siguiente, agregue el evento OnItemDataBound .

        <%#Eval("Content") %>    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); }