分页解决方案 —— 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的关系一样。      

SqlConnection cn = new SqlConnection();
SqlCommand cm = new SqlCommand();
cm.Connection = cn;
cm.Connection.Open();

 

      同样,QuickPager 里面一个一个成员的类型就是PagerSQL(也就是QuickPager_SQL)。

      

      2、QuickPager与DataAccessLibrary

      他们是通过一个接口(IDALforPager)联系在一起的,

      

Code
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里的一些控件的继承关系,发现虽然控件很多,但是我只需要做三次判断就可以了,这就是基类的好处吧。

Code
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、一般显示数据

protected override void OnInit(EventArgs e)
        {
            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、查询数据

 处理查询数据的情况#region 处理查询数据的情况
        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、添加、修改、删除后重新显示数据

 添加后重新显示数据#region 添加后重新显示数据
        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:今天先写这么多,以后再详细说明。

 

时间: 2024-10-26 05:07:18

分页解决方案 —— GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库的相关文章

分页解决方案之GridView+QuickPager+QuickPager_SQL+DataAccessLibrary+数据

分页解决方案之GridView+QuickPager+QuickPager_SQL+DataAccessLibrary+数据库 这里要说的不仅仅是一个分页控件,而是一套解决方案,包括如何显示数据.显示分页导航,如何得到分页用的sql语句(等效于存储过程),如何提取数据,如何绑定控件,如何响应事件,添加.修改.删除数据后如何更新,如何查询数据等等.一整套完整的解决方案. 这个方案要有几个特点: 1.支持多种数据库,可以提供多个分页算法以便于支持多种数据库. 2.可以在不同的要求下选用最优的分页算法

分页解决方案 之 QuickPager的使用方法(目录)

        QuickPager asp.net 2.0 分页控件,基本告一段落.现在把使用方法.源码.Demo公布一下,感兴趣的可以下载看看.       一.从提取数据的角度开看,可以分为"自动"和"自定义"两种.       "自动"就是分页控件内部利用Pager_SQL和DataAccessLibrary,"自动"获取数据,然后绑定到显示数据的控件.而且可以自动处理分页产生的事件.就是说用了"自动&quo

分页解决方案 之 QuickPager的使用方法(PostBack分页、自动获取数据)

        适用范围:网站后台管理.OA.CRM.CMS等,从关系型数据库里提取数据,愿意使用Pager_SQL.DataAccessLibrary的情况.       最佳数据库:MS SQL.       优点:只需要设置几个属性即可,不用编写"分页事件"的处理代码.可以很方便的实现查询功能,以及保存查询条件.       Demo下载:http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html       使用方法:

分页解决方案 之 QuickPager的使用方法(PostBack分页、自定义获取数据)

          适用范围:网站后台管理.OA.CRM.CMS等,从关系型数据库里提取数据,或者XML等获取数据,不愿意使用Pager_SQL.DataAccessLibrary的情况.       优点:可以使用自己喜欢的方式获取数据,不仅仅限于关系型数据库,其他的也都可以.       缺点,要写的代码比较多.       Demo下载:http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html       使用方法:   usin

分页解决方案 之 QuickPager的使用方法(URL分页、自动获取数据)

        适用范围:网站前台页面 等,从关系型数据库里提取数据,愿意使用Pager_SQL.DataAccessLibrary的情况.       优点:使用URL的方式,对于SEO比较友好.       缺点:保留查询状态没有太好的办法,GO的功能没有实现,有空看看别人是怎么做的.       Demo下载:http://www.cnblogs.com/jyk/archive/2008/07/29/1255891.html       使用方法:     using JYK.Data;u

分页解决方案 之 QuickPager的使用方法(在UserControl里面使用分页控件的方法)

          因为我一直没有在UserControl里面使用过QuickPager分页控件,我都是直接在.aspx里面使用,所以这个bug一直没有发现.后来告诉我他把分页控件放在了UserControl里面无法翻页的情况,检查之后才发现分页的事件没有传递到UserControl里面的分页控件里面,就是说分页控件没有得到分页事件.改了半天也没有找到从正规的方式来解决,所以只好采用了一个笨办法来解决.在UserControl里面使用分页控件的时候也稍稍有一点不同.       一般的情况是这么

分页解决方案 之 数据访问函数库——另类的思路、另类的写法,造就了不一样的发展道路。

      上一篇:分页解决方案 -- GridView + QuickPager + QuickPager_SQL + DataAccessLibrary + 数据库         如何访问数据库?一个老掉牙的问题,方法多了去了,什么直接使用ado.net.使用SQLHelp.使用微软的企业库.使用ORM.使用LinQ to SQL等等,还可以使用自己封装的函数库,这里我就想说一下我的数据访问函数库的使用方法.       您可能会说了,这么简单的东东还用说吗,重复制作轮子有意义吗?这个嘛,

.Net工具 - 使用动软代码生成器快速生成可分页的GridView

GridView虽然自带了分页功能,但我们还是习惯自己来取需要的数据,在此使用了AspNetPager控件,也是免费的,当然不是广告了,也是实验了不少控件后选出来比较适合自己用的,结合代码生成器可快速生成可分页的GridView AspNetPager官方站点:可下载到dll及源代码http://www.webdiyer.com/AspNetPager/default.aspx 分页存储过程如下:根据铁拳的代码稍微修改了一下 [复制到剪贴板] CODE: USE [××数据库名] GO /***

miniui datagrid的客户端分页解决方案

官方的解决方案 官方在"在线示例"中给了一个简单的 client pagination 解决方案,代码就不贴了,这里说说它的基本思想和处理过程. 首先,是绑定一个 preload 事件,在这个事情中设置 event.cancel = true,阻止 datagrid 在翻页的时候向服务器请求加载数据. 那么数据从哪来呢?当然只有在外部写一个 ajax 过程获取了.不过取得的数据并不直接交给 datagrid,而是缓存起来,放在dataResult 中. 现在继续说 preload,除了