Изменить класс элемента ретранслятора li, если первый или последний
Я использую повторитель для создания динамического списка ul li
Можно ли управлять классом, является ли элемент первым или последним?
Что-то вроде:
class="<%# if(Container.ItemIndex == 0)
{
class = ...
}
) %>"
кстати, что это значит: <%#
в ASP.NET
В чем разница между <%#
и <%=
?
Ответы
Ответ 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 %>
Ответ 6
Что касается вашего вопроса о различии между <% = и <% #, см. следующие ссылки:
Блокировка кода:
http://msdn.microsoft.com/en-us/library/k6xeyd4z(v=vs.71).aspx
Синтаксис выражения привязки данных:
http://msdn.microsoft.com/en-us/library/bda9bbfx(v=vs.71).aspx
Ответ 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);
}