最近在做一个消息模块,这个消息模块需求如下:1、写消息,2、列表显示消息,3、根据不同的消息分类检索消息,4、查看消息,快速回复消息,5、批量删除消息,6、未读消息提醒。为实现以上一系列功能我使用了Repeater实现高效分页、JQuery+Ajax技术实现静态批量删除、查看、回复。

1、消息模块数据表

 2、写消息,直接跳转到一个页面写消息,本篇重点在于Repeater实现高效分页介绍了

3、Repeater实现高效分页

Repeater在数据控件中是一个比较轻量级的控件,这也使得它用起来比较灵活,也是我非常喜欢的一个控件,使用它可以灵活的实现各种功能,在实现消息模块的时候我使用它来是实现了高效分页的功能。(为什么我说是高效分页?这里的分页并不是向其他一些实现分页的方案,是使用PagedDataSource来实现分页,它的把数据全部读出来然后再计算页数,并获取该页的数据,这也的方法在数据量比较大的时候就会导致系统运行比较慢。高效分页是每次只读出相应页数的数据,不会因数据量变大而导致的系统运行速度较慢的情况。)

用到的一个SQLHelper类的一个分页方法

  /// <summary>
        /// 分页查询方法,适用于任何表或者视图
        /// author:Jerry
        /// date:2011-7-6
        ///直接可以传递要取第几页,就可以取得该页数据,使用了SQL Server2005及以上版本可以计算Row_Number()的特性
        /// </summary>
        /// <param name="selectColumnName">要查询的字段</param>
        /// <param name="tableName">要查询的表名或者视图名</param>
        /// <param name="orderColumnName">要排序的字段名</param>
        /// <param name="pageIndex">要查询第几页</param>
        /// <param name="size">返回的最大记录数</param>
        /// <param name="parameters">查询中用到的参数集合</param>
        /// <returns>返回分页查询结果</returns>
        public DataTable GetPagedDataTable(string selectColumnName, string orderColumnName,string where, string tableName, OrderBy orderBy, int pageIndex, int size, SqlParameter[] parameters)
        {
            int startIndex = (pageIndex - 1) * size + 1;//计算开始的位置
            int endIndex = pageIndex * size;//计算结束的位置
            string orderByString = orderBy == OrderBy.ASC ? " ASC " : " DESC ";//排序方式
            StringBuilder buffer = new StringBuilder();
            buffer.Append("select * from (");
            buffer.AppendFormat("select {0},Row_Number() over (order by {1} {2}) rownum from {3} where {4})temp",selectColumnName,orderColumnName,orderByString,tableName,where);
            buffer.AppendFormat("  where temp.rownum>={0} and temp.rownum<={1}",startIndex,endIndex);
            string commText = buffer.ToString();
            return ExecuteDataTable(commText,CommandType.Text,parameters);
        }

 实现repeater高效分页的后台代码

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using NS.Entity;

namespace erp.SystemManager
{
    public partial class message : System.Web.UI.Page
    {
        string id = "123";//id是从session中获取,表示登录人的编号ID
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Message mess = new Message();
                //Employee emp = new Employee();
                //emp = (Employee)Session["ThisUser"];
                string sql = "select top 10 mes_ID,mes_sendPer,mes_title,mes_addTime,mes_type,mes_Status from Message ";
                sql = sql + " where mes_acceptPer='"+id+"' order by mes_addTime desc";
                SqlHelper.SqlDbHelper db = new SqlHelper.SqlDbHelper();
                string sql2 = "select count(*) from Message ";
                sql2 = sql2 + "where mes_acceptPer='"+id+"'";
                int countOfpage = int.Parse(db.ExecuteScalar(sql2).ToString());
                labCurPage.Text = "1";
                labZongShu.Text = countOfpage.ToString();
                if (countOfpage % 10 == 0)
                {
                    labPage.Text = (countOfpage / 10).ToString();
                }
                else
                    labPage.Text = (countOfpage / 10 + 1).ToString();
                DataTable dt = new DataTable();
                dt = db.ExecuteDataTable(sql);
                Repeater1.DataSource = newData(dt);
                Repeater1.DataBind();
            }
        }
        private static DataTable newData(DataTable dt)
        {
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                if (dt.Rows[i]["mes_Status"].ToString() == "0")
                {
                    dt.Rows[i]["mes_Status"] = "未阅读";
                }
                else if (dt.Rows[i]["mes_Status"].ToString() == "1")
                {
                    dt.Rows[i]["mes_Status"] = "已阅读";
                }
                else
                {
                    dt.Rows[i]["mes_Status"] = "已回复";
                }
            }
            return dt;
        }
        protected void btnFirst_Click(object sender, ImageClickEventArgs e)
        {
            labCurPage.Text = "1";
            bind(1); pagecount();
        }

        protected void btnSearch_Click(object sender, EventArgs e)
        {
            
            string where = " and ";
            string type = DropDownList1.Text;
            string status = DropDownList2.Text;
            
            if (type == "全部类型的消息" && status == "全部状态的消息")
            {
                where = "";
            }
            else if (type != "全部类型的消息" && status == "全部状态的消息")
            {
                where = where + " mes_type ='"+type+"'";
            }
            else if (type == "全部类型的消息" && status != "全部状态的消息")
            {
                if (status == "已阅读")
                {
                    where = where + "mes_Status='1'";
                }
                else if (status == "未阅读")
                {
                    where = where + "mes_Status='0'";
                }
                else if (status == "已回复")
                {
                    where = where + "mes_Status='2'";
                }
            }
            else
            {
                if (status == "已阅读")
                {
                    where = where + "mes_Status='1'";  
                }
                else if (status == "未阅读")
                {
                    where = where + "mes_Status='0'";
                }
                else if (status == "已回复")
                {
                    where = where + "mes_Status='2'";
                }
                where = where + "  and mes_type ='" + type + "'";
            }
            Session["where"] = where;
            Message mess = new Message();
            //Employee emp = new Employee();
            //emp = (Employee)Session["ThisUser"];
            string sql = "select top 10 mes_ID,mes_sendPer,mes_title,mes_addTime,mes_type,mes_Status from Message ";
            sql = sql + " where mes_acceptPer='"+id+"' "+where+" order by mes_addTime desc";
            SqlHelper.SqlDbHelper db = new SqlHelper.SqlDbHelper();
            string sql2 = "select count(*) from Message ";
            sql2 = sql2 + "where mes_acceptPer='"+id+"'";
            sql2 += where;
            int countOfpage = int.Parse(db.ExecuteScalar(sql2).ToString());
            labCurPage.Text = "1";
            labZongShu.Text = countOfpage.ToString();
            if (countOfpage % 10 == 0)
            {
                labPage.Text = (countOfpage / 10).ToString();
            }
            else
                labPage.Text = (countOfpage / 10 + 1).ToString();
            DataTable dt = new DataTable();
            dt = db.ExecuteDataTable(sql);
            Repeater1.DataSource = newData(dt);
            Repeater1.DataBind();
        }

        protected void btnback_Click(object sender, ImageClickEventArgs e)
        {
            string cur = labCurPage.Text;
            int num = int.Parse(cur);
            if (num == 1)
            {
                Response.Write(" <script type='text/javascript'>alert('这是第一页!');</script>");
            }
            else
            {
                num--;
                labCurPage.Text = num.ToString();
                bind(num); pagecount();
            }
        }

        /// <summary>
        /// 根据页数不同绑定数据
        /// </summary>
        /// <param name="num">页数</param>
        private void bind(int num)
        {
            string where;
            if (Session["where"] == null)
            {
                where = "";
            }
            else
                where = Session["where"].ToString();
            SqlHelper.SqlDbHelper db = new SqlHelper.SqlDbHelper();
            where = "mes_acceptPer='" + id + "' " + where;
            string selectColumn = "mes_ID,mes_sendPer,mes_title,mes_addTime,mes_type,mes_Status";
            DataTable dt = new DataTable();
            dt = db.GetPagedDataTable(selectColumn, "mes_addTime", where, "Message", SqlHelper.OrderBy.DESC, num, 10, null, 0);
         //   dt = db.GetPagedDataTable(selectColumn, "mes_addTime", "Message", SqlHelper.OrderBy.DESC, num, 10, null,0);
            Repeater1.DataSource = newData(dt);
            Repeater1.DataBind();
        }
        private void pagecount()
        {
            string where;
            if (Session["where"] == null)
            {
                where = "";
            }
            else
                where = Session["where"].ToString();
            SqlHelper.SqlDbHelper db = new SqlHelper.SqlDbHelper();
            string sql2 = "select count(*) from Message ";
            sql2 = sql2 + "where mes_acceptPer='" + id + "'";
            sql2 += where;
            int countOfpage = int.Parse(db.ExecuteScalar(sql2).ToString());
            labZongShu.Text = countOfpage.ToString();
            if (countOfpage % 10 == 0)
            {
                labPage.Text = (countOfpage / 10).ToString();
            }
            else
                labPage.Text = (countOfpage / 10 + 1).ToString();
        }
        protected void btnnext_Click(object sender, ImageClickEventArgs e)
        {
            string cur = labCurPage.Text;
            string last = labPage.Text;
            int zongshu = int.Parse(last);
            int num = int.Parse(cur);
            if (num == zongshu)
            {
                Response.Write(" <script type='text/javascript'>alert('这是最后一页!');</script>");
            }
            else
            {
                num++;
                labCurPage.Text = num.ToString();
                bind(num); 
                pagecount();
            }
           
        }

        protected void btnLast_Click(object sender, ImageClickEventArgs e)
        {
            string last = labPage.Text;
            int zongshu = int.Parse(last);
            labCurPage.Text = last;
            bind(zongshu);
            pagecount();
        }

        protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
        {
            string page = tbnum.Text;
            string cur = labCurPage.Text;
            string last = labPage.Text;
            int zongshu = int.Parse(last);
            int curpage = int.Parse(page);
            labCurPage.Text = cur;
            if (curpage > 0 && curpage <= zongshu)
            {
                bind(curpage); pagecount();
            }
            else
            {
                Response.Write(" <script type='text/javascript'>alert('输入页数有误!');</script>");
            }
        }
        
    }
}

 前台代码只贴repeater相关模块

<asp:Repeater ID="Repeater1" runat="server" EnableViewState="False">
                <ItemTemplate>
                <tr>
                <td bgcolor="#FFFFFF" ><div align="center">
                    <input type="checkbox" name="checkbox3" value="checkbox" checkbox=true curId="<%# DataBinder.Eval(Container.DataItem, "mes_ID")%>" />
                </div></td>
                <td bgcolor="#FFFFFF"><div align="center"><span class="STYLE1"><%# DataBinder.Eval(Container.DataItem, "mes_sendPer")%></span></div></td>
                <td bgcolor="#FFFFFF"><div align="center"><span class="STYLE1"><%# DataBinder.Eval(Container.DataItem, "mes_title")%></span></div></td>
                <td bgcolor="#FFFFFF"><div align="center"><span class="STYLE1"><%# DataBinder.Eval(Container.DataItem, "mes_addTime")%></span></div></td>
                <td bgcolor="#FFFFFF" ><div align="center"><span class="STYLE1"><%# DataBinder.Eval(Container.DataItem, "mes_type")%></span></div></td>
                <td bgcolor="#FFFFFF" ><div align="center"><span status=true curId="<%# DataBinder.Eval(Container.DataItem, "mes_ID")%>" ><%# DataBinder.Eval(Container.DataItem, "mes_Status")%></span></div></td>
                <td bgcolor="#FFFFFF" ><div align="center"><span class="STYLE4">
                <img src="http://images.cnblogs.com/edit.gif" width="16" height="16" /><a href="#" chankan=true curId="<%# DataBinder.Eval(Container.DataItem, "mes_ID")%>">查看</a> 
                 <img src="http://images.cnblogs.com/add.gif" width="16" height="16"><a href="EditMessage.aspx?id=<%# DataBinder.Eval(Container.DataItem, "mes_sendPer")%>">回复</a>  
                 <img src="http://images.cnblogs.com/delete.gif" width="16" height="16" /><a href="#" delete=true curId="<%# DataBinder.Eval(Container.DataItem, "mes_ID")%>">删除</a>
                 </span></div></td>
              </tr>
                
                </ItemTemplate>
                </asp:Repeater>

Repeater实现高效分页实现完成

由于本人是个新手,贴了很多代码,因为篇幅太长批量静态删除下篇再说,欢迎批评指正。。

作者: Jerry_Wang 发表于 2011-07-15 14:04 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"