GridView的分页是否真的是鸡肋呢?

    现在大家一直都公认GridView的分页算法效率特别低,大家都是采用按需所取,只取当前页的数据,并不把所有记录全部取出来.在数据量大的情况下,此种方案无疑是最优的.但是有的时候有可能没有办法这样办到,比如:


        1: 数据集需要跨远程数据库.


        2 :数据集的返回方式可能是web service或者是.net remoting,wcf等分布式形式.

        3 :返回的数据库会发生多次的排序操作.

   
    针对某些情况,我们应该实际情况实际分析.


        1:结果集以远程web service返回,分布式调用性能略抵,频繁的调用并不理想.


        2:数据集需要跨数据库.有时数据需要整合两个以上的数据库的数据,这对按需所取造成一定的困难.


        3:数据量特别大,所以只允许杳前n条记录,例如前3000条.这种最终查询数据量不大的情况下,全部取出所付的代价并不大.


        4:对结果集会有多种排序操作.如果不一次性全部取出来,那么每一次排序你都要重新调用数据库,这样并不完美.

     
      解决方案: 所以我觉的上面的情况并不适合按需所取,就算全取出来也不过3000条,对于web service来说也是完成没问题的.如果些时把结果集缓存起来,第二次绑定的时候就不用调用数据库而直接调用缓存,这样效率上会非常高.


    当 GridView 控件移动到新的数据页时,该控件会引发两个事件。PageIndexChanging 事件在 GridView 控件执行分页操作之前发生。PageIndexChanged 事件在新的数据页返回到 GridView 控件之后发生。引自MSDN,也就是说分页事件发生后会重新绑定数据集.即点击任何一页都要把所有的数据全部取出来,这样在性能上的代价当然是相当高,而且的时是无法忍受的.


   本人在本地测试中,构造了一个具有12列100000行的DataTable,然后绑定在GridView,然后将 GridView 控件的 AllowPaging 属性设置为 true,在PageIndexChanging事件中写入如下代码:

///   <summary>
        
///  分页事件
        
///   </summary>
        
///   <param name="sender"></param>
        
///   <param name="e"></param>
         protected   void  GridView1_PageIndexChanging( object  sender, GridViewPageEventArgs e)
        {
            
// 将新的索引值赋值给GridView
             this .GridView1.PageIndex   =  e.NewPageIndex;
            
// 重新绑定数据
            display();
        }

 

     相关的方法如下(没有启用缓存):

 

ContractedBlock.gif ExpandedBlockStart.gif Code
protected void Page_Load(object sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif        
{
            
if (!IsPostBack)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                display();
            
            }

        }

ExpandedBlockStart.gifContractedBlock.gif        
/**//// <summary>
        
/// 取得相应记录集
        
/// </summary>

        private void display()
ExpandedBlockStart.gifContractedBlock.gif        
{
            Class1 A 
= new Class1();
            
this.GridView1.DataSource = A.BLL_getDataTable();
            
this.GridView1.DataBind();
        
        }

ExpandedBlockStart.gifContractedBlock.gif
/**//// <summary>
        
/// 模似一个数据比较大的记录集
        
/// 这里为100000行数据,每行有12列
        
/// </summary>
        
/// <returns></returns>

        public DataTable BLL_getDataTable2()
ExpandedBlockStart.gifContractedBlock.gif        
{
            DataTable dr 
= new DataTable();
            dr.Columns.Add(
"id");
            dr.Columns.Add(
"id2");
            dr.Columns.Add(
"id3");
            dr.Columns.Add(
"id4");
            dr.Columns.Add(
"id5");
            dr.Columns.Add(
"id6");
            dr.Columns.Add(
"id7");
            dr.Columns.Add(
"id8");
            dr.Columns.Add(
"id9");
            dr.Columns.Add(
"id10");
            dr.Columns.Add(
"id11");
            dr.Columns.Add(
"id12");
            
for (int i = 0; i < 100000; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                DataRow workRow 
= dr.NewRow();

                workRow[
0= i.ToString();
                workRow[
1= i.ToString() + "1sldjkfljsdfljk";
                workRow[
2= i.ToString() + "2sldjkfljsdfljk";
                workRow[
3= i.ToString() + "3sldjkfljsdfljk";
                workRow[
4= i.ToString() + "4sldjkfljsdfljk";
                workRow[
5= i.ToString() + "5sldjkfljsdfljk";
                workRow[
6= i.ToString() + "6sldjkfljsdfljk";
                workRow[
7= i.ToString() + "7sldjkfljsdfljk";
                workRow[
8= i.ToString() + "8sldjkfljsdfljk";
                workRow[
9= i.ToString() + "9sldjkfljsdfljk";
                workRow[
10= i.ToString() + "10sldjkfljsdfljk";
                workRow[
11= i.ToString() + "11sldjkfljsdfljk";


                dr.Rows.Add(workRow);
            }

            
return dr;

        }

 

      此时点击任何一页的数据,加载的时间都是3S以上,不过当我作用缓存后时间都是1S以下.

      使用缓存的方法如下:


 

ContractedBlock.gif ExpandedBlockStart.gif Code
ExpandedBlockStart.gifContractedBlock.gif/**//// <summary>
        
/// 模似一个数据比较大的记录集
        
/// 这里为100000行数据,每行有12列
        
/// </summary>
        
/// <returns></returns>

        public DataTable BLL_getDataTable()
ExpandedBlockStart.gifContractedBlock.gif        
{
            DataTable dr 
= new DataTable();
            
if (HttpContext.Current.Cache["pagerDataTable"!= null)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                dr 
= (DataTable)HttpContext.Current.Cache["pagerDataTable"];

            }

            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                dr.Columns.Add(
"id");
                dr.Columns.Add(
"id2");
                dr.Columns.Add(
"id3");
                dr.Columns.Add(
"id4");
                dr.Columns.Add(
"id5");
                dr.Columns.Add(
"id6");
                dr.Columns.Add(
"id7");
                dr.Columns.Add(
"id8");
                dr.Columns.Add(
"id9");
                dr.Columns.Add(
"id10");
                dr.Columns.Add(
"id11");
                dr.Columns.Add(
"id12");
                
for (int i = 0; i < 100000; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    DataRow workRow 
= dr.NewRow();

                    workRow[
0]  = i.ToString();
                    workRow[
1= i.ToString() + "1sldjkfljsdfljk";
                    workRow[
2= i.ToString() + "2sldjkfljsdfljk";
                    workRow[
3= i.ToString() + "3sldjkfljsdfljk";
                    workRow[
4= i.ToString() + "4sldjkfljsdfljk";
                    workRow[
5= i.ToString() + "5sldjkfljsdfljk";
                    workRow[
6= i.ToString() + "6sldjkfljsdfljk";
                    workRow[
7= i.ToString() + "7sldjkfljsdfljk";
                    workRow[
8= i.ToString() + "8sldjkfljsdfljk";
                    workRow[
9= i.ToString() + "9sldjkfljsdfljk";
                    workRow[
10= i.ToString() + "10sldjkfljsdfljk";
                    workRow[
11= i.ToString() + "11sldjkfljsdfljk";
                    
                    
                    dr.Rows.Add(workRow );
                
                }

                HttpContext.Current.Cache[
"pagerDataTable"= dr;
            }

            
return dr;
        
        }

 

      下面是两张没有用缓存的用时情况:


      

 

     下面是两张使用缓存后的用时情况:

 

        总结:凡是一个产品的存在总会有它存在的道理,所有我们应该实际情况实际分析,不能千篇一律,只要用心总能找出适用自己的方法.是否是鸡肋,不在事物本身,而在于看待事物的人,不同的眼光会看出不同的风采.

注:

    本文引用:MSDN

转载于:https://www.cnblogs.com/ASPNET2008/archive/2008/10/08/1306699.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值