我的分页用户控件(性能问题)

看过了很多大大的分页控件,用了AspNetPager感觉还不错,不过必须点一次分页按钮都要重新读一次数据库,我想了想到底能不能不要每次都读数据库呢?而且能够根据服务器的带宽和数据库的承载能力,而动态的调节?
我初步做了下,自我感觉也不是很差,当然这只是我的感觉而已。
主要功能:实现对Repeater,DataList,DataGrid,GridView的分页功能。

我认为的优点:
1:不要自己再构造复杂的分页存储过程;
2:把预加载页数(不是全部的页数,这个可以自己定义)的数据保存在ViewState里面,分页时,如果数据在预加载的页数范围内,那么就不要再从数据库里面读,而是直接从ViewState里面取,这样就能适当的减少数据库的负担;
3:自我感觉,至少要比系统GridView,DataGrid的分页效率要高。


自我认为适应的场合:数据量不是很大的网站,尤其是个人网站,我认为够用了。

实现的原理主要是:设定预加载数据的页数(这个是关键,如果带宽够可以设大一点,当然也不能太大了),每页的记录数...其他一些属性就省略了
举个例子吧:
如果设定预加载的页数为3,那么如果查询的数据超过3页的话,当你分页的时候,只要是在3页内的数据,都不会再去读数据库,而是从Viewstate里面读。

性能考虑:我把数据保存在Viewstate里面合理吗?这样的分页控件能投入使用吗?
希望大家能提些建议,如果这个可以的话,我将把改进后的控件发布出来。

还是先发出来,和大家一起探讨一下吧:
下面是对DataList的一个分页例子:

DataList的具体操作如下:
string constr="server=.;database=NorthWind;uid=test;pwd=123456";
    protected void Page_Load(object sender, EventArgs e)
    {
        this.CustomPager1.refresh += new WebUserControl_CustomPager.MyDeletegate(FillData);//这句不能少,很重要,在数据需要重
新绑定时发生

        if (!IsPostBack)
        {
            FillData();
        }
    }

    private void FillData()
    {
        DataSet ds = new DataSet();
        ds = SqlHelper.ExecuteDataset(constr, "getAllOrders");
        CustomPager1.ActivePageCount = 3;//很重要,设定预加载数据的页数,根据带宽和内存设置
        CustomPager1.DataSourceType = "DataList";//指定数据控件的类型
        CustomPager1.DataSourceName = "DataList1";//数据控件的名称
        CustomPager1.DataSource = ds.Tables[0];
        CustomPager1.PageItems = ds.Tables[0].Rows.Count;//得到所有记录的条数
        CustomPager1.InitPagerData();//执行绑定过程
    }
下面是这个用户控件的下载
/Files/xiaozhou/CustomPager.rar

posted @ 2007-10-24 13:31  xiaozhou  阅读(580)  评论(1编辑  收藏  举报