我正在使用转发器来创建动态ul列表
是否可以控制类是第一个还是最后一个?
类似的东西:
class="<%# if(Container.ItemIndex == 0)
{
class = ...
}
) %>"
顺便说一下它的真正含义:ASP.NET中的<%#
<%#
和<%=
之间有什么区别?
答案 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);
}