分页解决方案 —— GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库
这里要说的不仅仅是一个分页控件,而是一套解决方案,包括如何显示数据、显示分页导航,如何得到分页用的sql语句(等效于存储过程),如何提取数据,如何绑定控件,如何响应事件,添加、修改、删除数据后如何更新,如何查询数据等等。一整套完整的解决方案。
这个方案要有几个特点:
1、支持多种数据库,可以提供多个分页算法以便于支持多种数据库。
2、可以在不同的要求下选用最优的分页算法。比如如果只需要按照主键排序,那么选择Max分页算法无疑是最快的一种分页算法。
3、按需所取。不管是哪一种分页算法,都要达到按需所取。假设一页显示20条记录,那么从数据库里面最多只提取20条记录,不可以多取一条。
4、使用简单。无论是更换分页算法,更换数据库,还是处理分页的事件,都是很简单的几行代码即可搞定。
5、很方便的实现数据查询的功能。查询后显示数据,查询后修改、删除数据,修改、删除后重新显示数据等。
6、每一个部分都可以替换。
7、支持海量数据。无论数据多还是少,都要适合,而且要尽量快。
分页解决方案的组成部分
显示数据的控件、分页控件、分页算法、数据访问函数库、数据库
如:GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + SQL Server2000
1、显示数据的控件可以是GridView、DetailsView、FormView、Repeater、DataGrid、DataList、CheckBoxList、RadioButtonList等。(控件的继承关系可以看这里http://www.cnblogs.com/jyk/archive/2009/04/29/1446033.html 这是.net 里面带的几个常用控件的继承树)。也可以支持直接返回DataTable等记录集。
2、分页控件,可以是QuickPager也可以是吴旗娃的分页控件,也可以是EasyTools等其他的分页控件。
3、分页算法目前还没有发现同类的,硬要算的话,储存过程有一点点类似。
QuickPager_SQL 原来是QuickPager里面的一部分,现在独立出来,可以单独使用了。
4、数据访问函数库可以换成SQLHelp、微软的企业库等,当然需要其他的实现一个接口(IDALforPager)。
5、数据库可以是Access、Excel、SQL Server,理论上也支持Orcale、MySQL等,只是没有安装这些数据库,所以还没有具体实现。
(至于ORM嘛,不是太了解,不知道能不能和哪个部分替换。)
各个部分之间的关系
1、QuickPager与QuickPager_SQL
这个就像SqlCommand和SqlConnection的关系一样。
SqlCommand cm = new SqlCommand();
cm.Connection = cn;
cm.Connection.Open();
同样,QuickPager 里面一个一个成员的类型就是PagerSQL(也就是QuickPager_SQL)。
2、QuickPager与DataAccessLibrary
他们是通过一个接口(IDALforPager)联系在一起的,
public interface IDALforPager
{
/// <summary>
/// 传入SQL语句,返回DataTable的接口
/// </summary>
/// <param name="sql">SQL语句</param>
/// <returns></returns>
DataTable ExecuteFillDataTable(string sql);
/// <summary>
/// 传入SQL语句,返回第一条记录,第一个字段的值的接口
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
string ExecuteString(string sql);
/// <summary>
/// 记录出错的描述信息
/// </summary>
string ErrorMessage { get; }
}
3、QuickPager与显示数据的控件
为了便于使用,就是说想在使用的时候尽量的少写代码,所以我是把显示数据的控件传递到了分页控件里面,然后在需要绑定控件的时候,采用as的方式来判断是哪种控件,然后在强制转换,最后实现绑定控件的目的。研究了一下.net里的一些控件的继承关系,发现虽然控件很多,但是我只需要做三次判断就可以了,这就是基类的好处吧。
private void DataBind(System.Web.UI.Control control, MarshalByValueComponent dt)
{
if (control == null)
return;
//为什么没有一个统一的DataSource呢?
BaseDataBoundControl tmpBaseDataBoundControl = control as BaseDataBoundControl;
if (tmpBaseDataBoundControl != null)
{
tmpBaseDataBoundControl.DataSource = dt;
tmpBaseDataBoundControl.DataBind();
}
else
{
Repeater tmpRepeater = control as Repeater;
if (tmpRepeater != null)
{
tmpRepeater.DataSource = dt;
tmpRepeater.DataBind();
}
else
{
BaseDataList tmpBaseDataList = control as BaseDataList;
if (tmpBaseDataList != null)
{
tmpBaseDataList.DataSource = dt;
tmpBaseDataList.DataBind();
}
else
{
//不在判断范围内,退出
return;
}
}
}
}
4、QuickPager_SQL与DataAccessLibrary、显示数据的控件没有任何关系。
5、QuickPager与QuickPager_UI
QuickPager_UI 也是分页控件的一个成员,因为至少有三种分页方式(PostBack、URL、XMLHttp),所以呢我采用了基类和子类的方式来实现这种需求,以达到可以随时扩展的需求。
分页解决方案从使用方法的角度来说,有两种方式。
第一种就是“自动运行”,设置属性,其他的就不用管了(仅限于QuickPager,其他的分页控件可能不支持);
另一种是“手动运行”,手动运行就要多做一些事情了(其他分页控件的情况)。
分页解决方案从提交数据的角度,有三种方式。
PostBack、URL、XMLHttp。当然这三种也是针对于QuickPager来说的,其他的分页控件是否支持,就看作者的了。
使用方法:
时间比较紧,所以这里先说一下使用方法是自动运行、PostBack的情况。
1、一般显示数据
{
base.OnInitComplete(e);
//数据访问函数库
DataAccessLibrary dal = DALFactory.CreateDAL();
Pager1.DAL = dal;
//定义QuickPager_SQL
PagerSQL pagerSQL = PagerSQL.Create(PagerSQLKind.MaxMin);
pagerSQL.Page = this;
Pager1.ManagerPageSQL = pagerSQL;
Pager1.ShowDataControl = this.GV; //设置显示数据的控件
}
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
SetPagerInfo(); //设置表名、字段名等
}
}
给QuickPager_SQL 设置属性,以便拼接SQL#region 给QuickPager_SQL 设置属性,以便拼接SQL
private void SetPagerInfo()
{
Pager1.ManagerPageSQL.TableName = "News_NewsInfo"; //表名或者视图名称
Pager1.ManagerPageSQL.TableShowColumns = "*"; //需要显示的字段
Pager1.ManagerPageSQL.TableIDColumn = "NewsID"; //主键名称,不支持复合主键
Pager1.ManagerPageSQL.TableOrderByColumns = "NewsID"; //排序字段,根据分页算法而定,可以支持多个排序字段
Pager1.ManagerPageSQL.TableQuery = ""; //查询条件
Pager1.PageSize = 4; //一页显示的记录数
}
#endregion
2、查询数据
protected void Btn_Search_Click(object sender, EventArgs e)
{
//获取查询条件
string query = "";
string tmp = "";
tmp = this.Txt_Title.TextTrimNone;
if (tmp.Length > 0)
{
if (query.Length == 0)
query = " title like '%" + tmp + "%'";
else
query += " and title like '%" + tmp + "%'";
}
//还可以添加其他的查询条件,这里省略
//给QuickPager_SQL 设置查询条件
this.Pager1.ManagerPageSQL.TableQuery = query; //设置查询条件
this.Pager1.BindFirstPage(); //重新绑定控件,显示第一页的数据
}
#endregion
3、添加、修改、删除后重新显示数据
protected void Btn_Add_Click(object sender, EventArgs e)
{
//添加新的数据后,显示第一页的数据
this.Pager1.BindFirstPage();
}
#endregion
修改数据后重新显示当前页的数据#region 修改数据后重新显示当前页的数据
protected void Btn_Mod_Click(object sender, EventArgs e)
{
//比如在第三页修改了一条数据,修改完毕后,重新显示第三页的数据。
this.Pager1.BindThisPage();
}
#endregion
添加后重新显示数据#region 添加后重新显示数据
protected void Btn_Del_Click(object sender, EventArgs e)
{
//比如在第三页删除了一条数据后,重新显示第三页的数据。
//和修改数据后重新显示的区别在于,删除数据后需要重新统计总记录数,和总页数
this.Pager1.BindThisPageForDelete();
}
#endregion
关于三层
现在三层还是很流行的,那么我的这个算不算是三层呢?其实算不算对于我来说是无所谓的事情,又没有谁规定,现在写项目必须三层(或者MVC),否则就是不合格产品。既然没有这个规定,那么我又为何要在乎是否可以靠到三层结构上呢?
另外呀,我觉得这么写代码挺简单的,要说简化,还确实是有简化的空间,但是说要往三层结构上面靠拢,我还确实不知道应该怎么做。
就像http://www.cnblogs.com/wisdomqq/archive/2009/04/29/1446579.html 里说的,“经常看到有的朋友使用三层结构或者MVC模式,比较生硬,强行进行拆分代码,使得业务代码分散在各个角落,反而更难阅读和维护了。”
我觉得这么写,对于简单的应用是没有什么问题的,当然了复杂的情况是有其他的方法来解决的。
代码下载:
http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html
ps:今天先写这么多,以后再详细说明。
分页解决方案 —— GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库相关推荐
- 分享一个完整的Mybatis分页解决方案
分享一个完整的Mybatis分页解决方案 参考文章: (1)分享一个完整的Mybatis分页解决方案 (2)https://www.cnblogs.com/gev-1016/p/6606114.htm ...
- Elasticsearch分页解决方案
Elasticsearch分页解决方案 参考文章: (1)Elasticsearch分页解决方案 (2)https://www.cnblogs.com/yfb918/p/11023581.html 备 ...
- java miniui datagrid_miniui datagrid 的客户端分页解决方案
官方的解决方案 官方在"在线示例"中给了一个简单的 client pagination 解决方案,代码就不贴了,这里说说它的基本思想和处理过程. 首先,是绑定一个 preload ...
- Java架构直通车——ElasticSearch深度分页解决方案
文章目录 分页查询 深度分页 深度分页解决方案 分页查询 分页查询是这样的: POST /shop/_doc/_search {"query": {"match_all& ...
- 在ASP.NET MVC5中实现具有服务器端过滤、排序和分页的GridView
背景 在前一篇文章<[初学者指南]在ASP.NET MVC 5中创建GridView>中,我们学习了如何在 ASP.NET MVC 中实现 GridView,类似于 ASP.NET web ...
- 京东面试题:ElasticSearch深度分页解决方案
前言 Elasticsearch 是一个实时的分布式搜索与分析引擎,在使用过程中,有一些典型的使用场景,比如分页.遍历等. 在使用关系型数据库中,我们被告知要注意甚至被明确禁止使用深度分页,同理,在 ...
- android gridview分页显示,GridView使用自带分页功能时分页方式及样式PagerStyle
GridView分页,使用自带分页功能,类似下面样式: 在aspx页面中,GridView上的PagerStyle下CssClass属性,设置为bubufxPagerCss,具体aspx页面代码: A ...
- ES的深度分页解决方案
索引:共4T,5个索引,共100亿条数据 查询语句: { "query":{ "term":{ "app_s ...
- datagrid分页传递参数_四类数据库分页实现方案总结之Mysql分页实现
概述 昨天介绍了Oracle分页实现方案,那么,mysql又是如何实现分页呢? 参考官网:https://dev.mysql.com/doc/refman/5.7/en/select.html mys ...
最新文章
- 对于七段数码数字模型进行改进:一个关键的数字1的问题
- linux——环境变量与文件查找
- Oracle面试题及答案整理
- 解决android中Layout文件下的xml文件配好后,R类中不能自动生成相应代码
- 04.卷积神经网络 W2.深度卷积网络:实例探究
- ajax实现上传文件
- IOS UI Automation 学习之常用类,方法和模拟手势
- Android Studio 3.2升级后的编译问题解决办法
- com线程模型实验之三
- numpy常用矩阵运算
- 计算机网络自顶向下方法 第六章 复习题答案
- 黑马程序员-黑马,人生的一个重要转折
- 基于CC2430和DS18B20的无线测温系统设计
- 040 罗尔定理与零点定理、介值定理综合应用;柯西中值定理; 型二( f(n) (ξ) =0 )
- 创业公司系统安全的搭建
- PDF Expert教程|七个提高效率的小技巧
- 3GPP TS 23501-g51 中英文对照 | 4.2.5 Data Storage architectures
- MATLAB 基础知识 数据类型 数据类型转换 将文本转换为数值
- RabbitMQ 进阶 -- 阿里云服务器部署RabbitMQ集群
- 全球共模扼流圈行业收入预计2028年达到9.167亿美元