Repeater是一个轻量级模板,灵活性比较强,相对于GridView和DataList等排版实现相对灵活,所以个人还是比较喜欢用的。但Repeater没有分页模板,并且如果用作后台的话,如果添加批量操作的功能,则也会受到限制,更何况我个人比较较真,一定要在ItemTemplate下边加批量操作模板和分页模板,最后再是FootTemplate模板。从网上搜了一大堆资料,虽然有扩展Repeater模板的,但对于更改Repeater的模板顺序,确是一篇也没有搜到,无奈之下,自己花了几天的时间,狠狠钻研了一下Repeater的模板代码,最后终于完成,并且还扩展出了一个EmptyTemplate模板,在空数据的时候自动显示EmptyTemplate的内容。
以下是代码示例:
aspx页面代码:
<asp:RepeaterPager ID="tNewsList" runat="server" onitemcommand="tNewsList_ItemCommand"> <HeaderTemplate> <table border="0" cellpadding="0" cellspacing="1" class="mainTable"> <tr> <th width="5%">选择</th> <th width="12%">所属分类</th> <th width="58%">标题</th> <th width="15%">属性</th> <th width="10%">操作</th> </tr> </HeaderTemplate> <ItemTemplate> <tr class="tdbg" onmouseover="ChangeColor(this,true)" onmouseout="ChangeColor(this,false)"> <td align="center"><asp:CheckBoxValue runat="server" ID="NewsIDChk" Value='<%#Eval("NewsID") %>'/></td> <td align="center"><%#Eval("ClassName") %></td> <td align="left"><%#Eval("Title") %></td> <td align="center"> <asp:LinkButton ID="IsHome" runat="server" CommandName="IsHome" CommandArgument='<%#Eval("NewsID") %>' ForeColor='<%#Eval("IsHome").ToString() == "True"?System.Drawing.Color.FromName("#ff0000"):System.Drawing.Color.FromName("#000000") %>'>首页</asp:LinkButton> <asp:LinkButton ID="IsTop" runat="server" CommandName="IsTop" CommandArgument='<%#Eval("NewsID") %>' ForeColor='<%#Eval("IsTop").ToString() == "True"?System.Drawing.Color.FromName("#ff0000"):System.Drawing.Color.FromName("#000000") %>'>置顶</asp:LinkButton></td> <td align="center"> <asp:ImageButton ID="EditNewsBtn" runat="server" ImageUrl="images/icon_edit.gif" CommandName="EditNews" CommandArgument='<%#Eval("NewsID") %>' /> <asp:ImageButton ID="DelNewsBtn" runat="server" ImageUrl="images/no.gif" CommandName="DelNews" CommandArgument='<%#Eval("NewsID") %>' OnClientClick="return confirm('确认要删除吗?')" /></td> </tr> </ItemTemplate> <OperateDataTemplate> <tr> <td class="foottr" align="center"><input id="Checkbox1" type="checkbox" name="chkall" onclick="CheckAll(form1)" /></td> <td colspan="5" class="foottr"><asp:DropDownList ID="BatchOperation" runat="server"> <asp:ListItem Text="请选择" Value=""></asp:ListItem> <asp:ListItem Text="批量删除" Value="Del"></asp:ListItem> <asp:ListItem Text="批量设为首页" Value="IsHomeTrue"></asp:ListItem> <asp:ListItem Text="批量取消首页" Value="IsHomeFalse"></asp:ListItem> <asp:ListItem Text="批量设为置顶" Value="IsTopTrue"></asp:ListItem> <asp:ListItem Text="批量取消置顶" Value="IsTopFalse"></asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="AgentsID" runat="server" style="display:none;"> </asp:DropDownList> <asp:Button ID="Button2" runat="server" Text="执行操作" CssClass="btn" OnClick="Button2_Click" /> </td> </tr> </OperateDataTemplate> <EmptyTemplate> <tr> <td colspan="5" class="tdbg" align="center">暂无内容</td> </tr> </EmptyTemplate> <FooterTemplate></table></FooterTemplate> </asp:RepeaterPager>
上面的代码中是并没有PageTemplate,是因为我把这部分的实现放到了控件的一个单独类中,最初是直接实现在扩展的Repeater控件中的,但后来发现虽然运行没有问题,但在vs中点击aspx页面的查看按钮时,总是不能正常显示Repeater的界面,无奈之下,只好把分页部分的代码单独放出来了。
以下是.aspx.cs页面的调用代码:
MyTemplate pagetemp = new MyTemplate();//新建一个MyTemplate模板对象,这个在控件中已经实现,扩展自ITemplate接口 pagetemp.Colspan = 5; //这个参数的作用在于如果Repeater为Table布局,设置分页所在行的HTML表格跨列数 pagetemp.PageSize = 12; //这个不用说,每页的显示数据 pagetemp.PageLayout = Layout.table; //设置Repeater的代码布局,如果是table,则会自动在分页开始末尾处加上tr和td标记 pagetemp.UrlFormat = "NewsManage.aspx?KeyWords=" + keywords + "&"; //设置URL格式,主要在分页时传参 pagetemp.RecordCount = (int)SqlHelper.ExecuteScalar(SqlHelper.ConnectionString, CommandType.Text, SqlCount + sqlwhere.ToString()); DataTable dt = SqlHelper.ExecuteDataset(SqlHelper.ConnectionString, CommandType.Text, Sql, pagetemp.PageSize * (pagetemp.CurrentPageIndex - 1), pagetemp.PageSize, "temptb1").Tables[0]; tNewsList.PageDataTemplate = pagetemp; //将pagetemp模板直接赋给PageDataTemplate模板 tNewsList.DataSource = dt; tNewsList.DataBind(); dt.Dispose();
关于批量操作的说明:
扩展之后Repeater不能通过Repeater.Items[i]取得某一模板项了,不过还是有变通的方法,我在扩展的Repeater中提供了一个ItemsList属性,可以遍历它得到的每一个对象即为:RepeaterItem。