Repeater实现高效分页+静态批量删除(消息模块实现全过程)(一)
最近在做一个消息模块,这个消息模块需求如下: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 通用数据层框架