閑話少說,還是說說今天要談的:Reteater,做asp.net的朋友可能都很喜歡的好東西,先插句,不是說GridView,DataList這類不好,看在什麼地方什麼情況下應用了,不過在前台頁面顯示來說,還是比較喜歡Repeater,效能好,而且很靈活,今天就舉個我在剛進公司時遇到的關於Repeater在小問題。
先說下問題,在一個UL,LI顯示圖片列表中,要求每行顯示四個圖片,本以為是一個超簡單的,也很有自信,拿過Repeater就編輯模板,可是我沒有注意到,每行的LI應用的樣式不同,所以問題也來了,經過一翻“折騰”,終於找著瞭解決辦法。
先看下寫完的模板:
Code
<asp:Repeater ID="Repeater1" runat="server" OnItemCreated="Repeater1_ItemCreated">
<HeaderTemplate>
<ul class="healweek">
</HeaderTemplate>
<ItemTemplate>
<li id="rep" runat="server"><a href="health_idea_detail.aspx?id=<%#Eval("id") %>&type=3">
<asp:Image ID="Image3" runat="server" ImageUrl='<%#Eval("Defaultimage","~/img/small/health/{0}") %>'
AlternateText='<%#Eval("idearname") %>' Width="160" Height="120"
/></a>
<span><a
href="health_idea_detail.aspx?id=<%#Eval("id") %>&type=3">
<%#Eval("idearname") %></a></span></li>
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
(為了完整性,把UL也添加在了頭部)
除了普通的方式編寫模板及內部的綁定資料外,在ItemTemplate內在li改為了<li id="rep" runset="server">
關鍵就在這,這樣就可以在CS檔案裡對LI進行動態操作,其他的都是再普通不過的綁定資料了。
在Repeater1_ItemCreated事件中對它進行了操作,如下:
Code
protected
void Repeater1_ItemCreated(object sender, RepeaterItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
if ((e.Item.ItemIndex +
1) %
4
==
0)
{
HtmlControl divContent = e.Item.FindControl("rep") as HtmlControl;
divContent.Attributes.Add("class", "lastChild");
}
}
}
解釋下:
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
大家非常熟悉,判斷模板內容項的
if ((e.Item.ItemIndex + 1) % 4 == 0)
這個就是進行判斷哪一項是要變更樣式,上例中是對每行最後一項也就是第4,8..進行更新樣式,所以在這裡當ItemIndex=3,7..時就執行下面的操作:
HtmlControl divContent = e.Item.FindControl("rep") as HtmlControl;
divContent.Attributes.Add("class", "lastChild");
尋找出REP,對其樣式修改為lastChild就OK了!
這隻是一個非常簡單的應用,多瞭解控制項的運行周期感覺挺有用。
當然也有別的方法可以實現,也可以在HTML頁面進行<%%>來動態輸出(asp.net mvc中常用)。