关于asp.net的排序问题,我曾经写过一篇文章:GridView使用DataSource绑定数据源之排序问题的解决
本文重点解决大数据量情况的分页与排序问题,使用SQL语句(非存储过程)优化,大大提高了大数据量情况下的分页与排序效率。
1、前台页面程序
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" ? Width="100%" AllowSorting="True" OnSorting="GridView1_Sorting" OnRowDataBound="GridView1_RowDataBound"> ......(省略) </asp:GridView> <!--AspNetPager分页控件,需要引用,网上比较容易找到--> <webdiyer:AspNetPager ID="AspNetPager1" runat="server" AlwaysShow="True" OnPageChanged="AspNetPager1_PageChanged" ShowCustomInfoSection="Right" CustomInfoHTML="第<font color='red'><b>%currentPageIndex%</b></font>页 共%PageCount%页 每页%PageSize%条 共%RecordCount%条" ?FirstPageText="首页" LastPageText="尾页" NextPageText="后页" PrevPageText="前页" CustomInfoTextAlign="Right"> </webdiyer:AspNetPager>
2、页面后台程序
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class Order : System.Web.UI.Page
{
const string vsKey = "searchCriteria"; //用于ViewState保存strWhere查询条件
private Order orderList; //自身
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
databinds();
}
}
//数据绑定
private void databinds()
{
//初始化分页控件,需要添加引用AspNetPager,网上比较容易找到
initAspNetPager();
//初始化SQL语句中的Where条件
getStrWhere();
//带有排序的数据绑定
sortdatabinds(ViewState[vsKey].ToString(), false);
}
//带有排序的数据绑定
private void sortdatabinds(string strWhere, bool isPageIndexChanging)
{
PagedDataSource pds = new PagedDataSource();
//获取DataSet
DataSet oitds = getorderList().setData(strWhere, isPageIndexChanging);
//设置分页控件
setAspNetPager(pds, oitds);
GridView1.DataSource = oitds.Tables[0].DefaultView;
GridView1.DataBind();
}
//返回当前页面的DataSet
private DataSet setData(string strWhere, bool isPageIndexChanging)
{
//调用GetList方法,重要部分
DataSet oitds = getOrderM().GetList(getPdsPage(), getPagerPageSize(), strWhere, GridViewSortExpression, returnSortDirection(isPageIndexChanging));
return oitds;
}
//方便对象调用
private static OrderM getOrderM()
{
OrderM oiap = new OrderM();
return oiap;
}
//设置分页控件
private void setAspNetPager(PagedDataSource pds, DataSet oitds)
{
DataView dv = oitds.Tables[0].DefaultView;
//获取总的记录数 InfoCount方法
AspNetPager1.RecordCount = getOrderM().InfoCount(ViewState[vsKey].ToString());
pds.DataSource = dv;
pds.AllowPaging = true;
pds.CurrentPageIndex = AspNetPager1.CurrentPageIndex - 1;
pds.PageSize = AspNetPager1.PageSize;
}
//初始化分页控件
private void initAspNetPager()
{
ConfigHelper.initAspNetPager(AspNetPager1);
}
//获取数据集当前页
private int getPdsPage()
{
return ConfigHelper.getPdsPage(AspNetPager1);
}
//获取每页记录数
private int getPagerPageSize()
{
return ConfigHelper.getPagerPageSize(AspNetPager1);
}
//当前页对象
private Order getorderList()
{
if (orderList == null)
{
orderList = this;
}
return orderList;
}
//返回查询条件
private void getStrWhere()
{
string strWhere;
......(省略)
//保存查询条件
ViewState[vsKey] = strWhere;
}
//页更改处理
protected void AspNetPager1_PageChanged(object src, EventArgs e)
{
int pageIndex = AspNetPager1.CurrentPageIndex - 1;
sortdatabinds(ViewState[vsKey].ToString(), true);
}
//排序处理
protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
GridViewSortExpression = e.SortExpression;
sortdatabinds(ViewState[vsKey].ToString(), false);
}
//获取排序方向
private string returnSortDirection(bool isPageIndexChanging)
{
string sorderection = "";
if (isPageIndexChanging)
{
sorderection = GridViewSortDirection;
}
else
{
sorderection = GetSortDirection();
}
return sorderection;
}
//排序方向
private string GridViewSortDirection
{
get { return ViewState["SortDirection"] as string ?? "ASC"; }
set { ViewState["SortDirection"] = value; }
}
//排序字段
private string GridViewSortExpression
{
get { return ViewState["SortExpression"] as string ?? string.Empty; }
set { ViewState["SortExpression"] = value; }
}
//新的排序方向
private string GetSortDirection()
{
switch (GridViewSortDirection)
{
case "ASC":
GridViewSortDirection = "DESC";
break;
case "DESC":
GridViewSortDirection = "ASC";
break;
}
return GridViewSortDirection;
}
}
3、ConfigHelper.cs(分页控件部分)
///
/// 设置分页控件
///
public static void initAspNetPager(AspNetPager AspNetPager1)
{
AspNetPager1.CurrentPageIndex = 1;
AspNetPager1.PageSize = getGlobalPageSize();
}
public static int getCurrPagerPage(AspNetPager AspNetPager1)
{
int currPagerPage = AspNetPager1.CurrentPageIndex;
return currPagerPage;
}
public static int getPdsPage(AspNetPager AspNetPager1)
{
return (getCurrPagerPage(AspNetPager1) - 1);
}
public static int getPagerPageSize(AspNetPager AspNetPager1)
{
return AspNetPager1.PageSize;
}
//从配置文件(web.config)读取每页显示记录数
public static int getGlobalPageSize(){
try
{
return Int32.Parse(GetConfigString("pagesize"));
}
catch
{
return 12;
}
}
4、OrderM.cs(GetList部分)
///
/// 获得数据列表
///
public DataSet GetList(int currPage, int pageSize, string strWhere, string sortExpression, string sorDirection)
{
return SubPageSelect.getSubPageSelect().GetList(currPage, pageSize, strWhere, sortExpression, sorDirection, "vsv_member", "member_id");
}
5、SubPageSelect.cs
构造分页排序的SQL语句,并返回查询结果
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using Bossma.DBUtility;//通用数据访问,需要替换成自己的
public class SubPageSelect
{
private static SubPageSelect subPageSelect;
public static SubPageSelect getSubPageSelect()
{
if (subPageSelect == null)
{
subPageSelect = new SubPageSelect();
}
return subPageSelect;
}
///
/// 获得数据列表
///
public DataSet GetList(int currPage, int pageSize, string strWhere, string sortExpression, string sorDirection, string tableName,string defaultStr)
{
StringBuilder strSql = new StringBuilder();
strSql.Append("select top " + pageSize + " * ");
strSql.Append(" FROM " + tableName + " ");
if (strWhere.Trim() != "")
{
strSql.Append(" where " + getStrWhere(currPage, pageSize, strWhere, sortExpression, sorDirection, tableName, defaultStr));
}
//DbHelperSQL为通用数据访问类,需要替换成自己的
return DbHelperSQL.Query(strSql.ToString());
}
///
/// 获取查询条件
///
///
/// string
private string getStrWhere(int currPage, int pageSize, string strWhere, string sortExpression, string sorDirection, string tableName, string defaultStr)
{
string newWhere = "";
if (sortExpression != string.Empty)
{
//当前排序方式
newWhere = strWhere + " and " + defaultStr + " not in (select top " + (currPage * pageSize) + " " + defaultStr + " from " + tableName + " where " + strWhere + " order by " + sortExpression + " " + sorDirection + ") order by " + sortExpression + " " + sorDirection;
}
else
{
//默认排序方式
newWhere = strWhere + " and " + defaultStr + " not in (select top " + (currPage * pageSize) + " " + defaultStr + " from " + tableName + " where " + strWhere + " order by " + defaultStr + " desc) order by " + defaultStr + " desc";
}
return newWhere;
}
}
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论