Подтвердить что ты не робот

Изменить класс элемента ретранслятора li, если первый или последний

Я использую повторитель для создания динамического списка ul li

Можно ли управлять классом, является ли элемент первым или последним?

Что-то вроде:

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

кстати, что это значит: <%# в ASP.NET

В чем разница между <%# и <%=?

4b9b3361

Ответ 1

Очень легко определить, является ли элемент первым или нет (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>

Ответ 2

Обычно я использую что-то вроде следующего:

<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>

Ответ 3

Если возможно, я бы рекомендовал использовать что-то вроде 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");

Ответ 4

Попробуйте что-нибудь подобное, если вы не используете 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>

Ответ 5

Я изменил решение nelsestu и придумал:

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

Ответ 7

Я не смог напрямую использовать ответ 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";
}

Ответ 8

Обычно я делаю это для последнего элемента

 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'", "")%>>

Ответ 9

Для тех, кому это нужно в VB, вот что работает для меня.

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

Мне нужен разделитель для показа всех элементов, кроме последнего.

Ответ 10

Если вы используете элементы управления в своем 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);
}