在FootTemplate与ItemTemplate中间扩展Repeater模板
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。
浙公网安备 33010602011771号