在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。


 

原文地址:https://www.cnblogs.com/superfeeling/p/2121940.html