111111
精灵王
精灵王
  • 注册日期2010-12-08
  • 发帖数640
  • QQ
  • 火币1103枚
  • 粉丝120
  • 关注75
  • 社区明星
阅读:3003回复:0

客户端回调实现gridview无刷新分页_asp.net技巧

楼主#
更多 发布于:2010-12-15 21:05
由于客户对速度和性能上的需求越来越变态,而数据量一天天的庞大,因此本人产生了数据的查询和分页完全由客户端回调来实现。想法看上去复杂,实现起来也不难。废话不多说,看程式吧。 一、存储过程包头:create or replace package H_QUERYPACK is  -- Author  : Evorul
  -- Created : 2007-3-29
  -- Purpose : 查询机构表
  
  -- Public type declarations
  type MYCURSOR is REF CURSOR;
   PROCEDURE QUERYLOG (RET_CURSOR OUT MYCURSOR,ERRORCODE OUT INT,p_logID int,p_StartTime Date,p_EndTime Date,p_Operator varchar2 ,p_OrderField varchar2 ,
      p_Desc int,p_PageSize Int,p_PageIndex Int,p_RecordCount Out Int);
end H_QUERYPACK;
 
包体:   create or replace package body H_QUERYPACK Is
  -- Author  : Evorul
  -- Created : 2007-3-29
  -- Purpose : 查询
  
  -- 查询公司,分页用
   PROCEDURE QUERYLOG (RET_CURSOR OUT MYCURSOR,ERRORCODE OUT INT,p_logID int,p_StartTime Date,p_EndTime Date,p_Operator varchar2 ,p_OrderField varchar2 ,
      p_Desc int,p_PageSize Int,p_PageIndex Int,p_RecordCount Out Int)
      AS
     v_sql varchar2(3000);
    v_sqlcount varchar2(3000);
    v_orderfield varchar2(100);
    v_order VARCHAR2(5); --顺序
    v_count int;
    v_heiRownum int;
    v_lowRownum int;
   BEGIN
        ERRORCODE:=0;
       v_sql:=select * from LOG Where 1=1 ;        if(p_logID <> 0)then
            v_sql := v_sql ||   and id = || TO_CHAR(p_logID);
        end if;
        IF p_Operator Is Not Null Then then
                v_sql := v_sql || And operator LIKE % || RTRIM(LTRIM(p_Operator))||%;        
          end if;
         v_sql := v_sql || and (TO_CHAR(time,YYYYMMDD) between || to_char(p_StartTime, YYYYMMDD) || and || to_char(p_EndTime, YYYYMMDD) ||);
         
       ----取记录总数
      v_sqlcount := select count(*) from ( || v_sql || );
      execute immediate v_sqlcount into v_count;
      p_RecordCount := v_count;
       --排序字段
        IF p_OrderField IS NOT NULL THEN
           v_orderfield:=p_OrderField;
           Else
           v_orderfield:=ID;
        END IF;
        --是否降序
        IF p_Desc <>0 THEN
          v_order:= ASC;
          Else
          v_order:= DESC;
        END IF;
        
        v_sql:=v_sql || ORDER BY || v_orderfield || v_order;
      ----执行分页查询
      v_heiRownum := p_PageIndex * p_PageSize;
      v_lowRownum := v_heiRownum - p_PageSize + 1;
     v_sql := SELECT * FROM (
                      SELECT A.*, rownum rn FROM (|| v_sql ||) A WHERE rownum <= || to_char(v_heiRownum) || ) B WHERE rn >= || to_char(v_lowRownum) ;

     OPEN RET_CURSOR FOR v_sql;       EXCEPTION
        WHEN NO_DATA_FOUND THEN
                  ERRORCODE:=9999;
        WHEN OTHERS THEN
                  ERRORCODE:=9999;
   END QUERYLOG;
  
   END H_QUERYPACK;
 二、程式
DataAccess.cs using System;
using System.Data;
using System.Data.OracleClient;
using System.Collections;
using System.Collections.Specialized;
/**////
///数据层  author: EvoRul   date:2007-03-29
///
public class DataAccess
...{
   /**////
    /// 返回数据库连接字符串
    ///
    public static String DatabaseConnectionString
    ...{
        get
        ...{
            NameValueCollection configSettings = (NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings");
            return configSettings["connectionString"];
        }
    }
   /**////
    /// 返回每一页显示的纪录数
    ///
    public static int RowsPerPage
    ...{
        get
        ...{
            NameValueCollection configSettings = (NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings");
            return Convert.ToInt32(configSettings["rowsPerPage"]);
        }
    }
   /**////
    /// 获取特定日志集合
    ///
    /// 日志类型
    /// 操作人
    /// 排序字段
    /// 是否升序 0-降序,1-升
    /// 页码
    /// 页行数
    /// 符合条件的总记录数
    ///
    public static ArrayList QueryLog(string strOperator,DateTime dtStartTime,DateTime dtEndTime, string strOrderField,
       int intASC, int PageIndex, int rowCount, out int recordSum)
    ...{
        // 返回集合
        ArrayList myArrayList = new ArrayList();
       // 创建连接
        OracleConnection myConnection = new OracleConnection(DatabaseConnectionString);
       try
        ...{
            // 打开连接
            myConnection.Open();
        }
        catch (Exception ex)
        ...{
            throw (ex);
        }
       try
        ...{
            // 创建存储过程
            OracleCommand myCommand = new OracleCommand("H_QUERYPACK.QUERYLOG", myConnection);
            myCommand.CommandType = CommandType.StoredProcedure;
            OracleDataReader dr;
           // ============================== 参数定义 ==============================            // 返回值
            myCommand.Parameters.Add("RET_CURSOR", OracleType.Cursor);
            myCommand.Parameters["RET_CURSOR"].Direction = ParameterDirection.Output;
            OracleParameter ret = myCommand.Parameters.Add("ERRORCODE", OracleType.Int32);
            ret.Direction = ParameterDirection.Output;
           OracleParameter retCountSum = myCommand.Parameters.AddWithValue("p_RecordCount", OracleType.Int32);
            retCountSum.Direction = ParameterDirection.Output;
           // 编号
            myCommand.Parameters.AddWithValue("p_logID", OracleType.Int32).Value = 0;
           // 用户编号
            myCommand.Parameters.AddWithValue("p_Operator", OracleType.VarChar).Value = strOperator;
           // 时间下限
            myCommand.Parameters.AddWithValue("p_StartTime", OracleType.DateTime).Value = dtStartTime;
           // 时间上限
            myCommand.Parameters.AddWithValue("p_EndTime", OracleType.DateTime).Value =dtEndTime;
           // 排序字段
            myCommand.Parameters.AddWithValue("p_OrderField", OracleType.VarChar).Value = strOrderField;
           // 怎么排序
            myCommand.Parameters.AddWithValue("p_Desc", OracleType.Int32).Value = intASC;
           // 每页行数
            myCommand.Parameters.AddWithValue("p_PageSize", OracleType.Int32).Value = rowCount;
           //页码
            myCommand.Parameters.AddWithValue("p_PageIndex", OracleType.Int32).Value = PageIndex;
           // ============================ 参数定义完毕 ============================            // 执行存储过程
            dr = myCommand.ExecuteReader();
           // 执行未成功
            if (Convert.ToInt32(ret.Value) != 0)
                throw new Exception("执行存储过程出错!");
           // 总记录数
            recordSum = Convert.ToInt32(retCountSum.Value);

           while (dr.Read())
            ...{
                // 创建新日志
                Log log = new Log();
               //操作业务类型
                if (dr["operationtype"] != DBNull.Value)
                ...{
                    log.OperationType = Convert.ToString(dr["operationtype"]);
                }
                // 时间
                if (dr["time"] != DBNull.Value)
                    log.Time = Convert.ToDateTime(dr["time"]);
               // 用户
                if (dr["operator"] != DBNull.Value)
                ...{
                    log.Operator = Convert.ToString(dr["operator"]);
                }
               // 信息
                if (dr["info"] != DBNull.Value)
                    log.Info = Convert.ToString(dr["info"]);
               // 加入返回集合
                myArrayList.Add(log);
            }
           dr.Close();
            return myArrayList;
        }
        catch (Exception ex)
        ...{
            throw (ex);
        }
        finally
        ...{
            myConnection.Close();
        }
    }
}
DataLogic.cs using System;
using System.Data;
using System.Configuration;
using System.Collections;
/**////
/// 业务逻辑层  author: EvoRul   date:2007-03-29
///
public class DataLogic
...{
    public DataLogic()
    ...{
    }
   public static int recordSum = 0;  
    /**////
    /// 查询日志
    ///
    /// 操作人
    /// 时间范围下限
    /// 时间上限
    /// 页码
    ///
    public static IEnumerable GetLogData(string strOperator,DateTime dtStarTime,DateTime dtEndTime, string Pageid)
    ...{
        return Log.GetList(strOperator,dtStarTime,dtEndTime,"time",1, Convert.ToInt32(Pageid),DataAccess.RowsPerPage,out recordSum);
    }
}
Log.cs using System;
using System.Data;
using System.Collections;
/**////
/// 日志类
///
public class Log
...{
    // ============================== 成员 ==============================
   protected string operationType;
    /**////
    /// 时间
    ///
    protected DateTime time = new DateTime();
   /**////
    /// 用户
    ///
    protected string m_operator;
   /**////
    /// 信息
    ///
    protected string info = "";

   // ============================== 属性 ==============================    public string OperationType
    ...{
        get ...{ return operationType; }
        set ...{ operationType = value; }
    }
    /**////
    /// 时间
    ///
    public DateTime Time
    ...{
        get ...{ return time; }
        set ...{ time = value; }
    }

   /**////
    /// 用户
    ///
    public string Operator
    ...{
        get ...{ return m_operator; }
        set ...{ m_operator = value; }
    }
   /**////
    /// 信息
    ///
    public string Info
    ...{
        get ...{ return info; }
        set ...{ info = value; }
    }
   // ============================== 方法 ==============================    /**////
    /// 创建空日志实例
    ///
    public Log()
    ...{
    }
   /**////
    /// 新增日志
    ///
    public void Add()
    ...{
        try
        ...{
            // 暂不支持该方法
            throw new Exception("新增日志");
        }
        catch (Exception ex)
        ...{
            throw (ex);
        }
    }
   /**////
    /// 修改日志(不支持)
    ///
    public void Modify()
    ...{
        // 暂不支持该方法
        throw new Exception("修改日志");
    }
   /**////
    /// 删除日志
    ///
    public void Del()
    ...{
        // 暂不支持该方法
        throw new Exception("修改日志");
    }
   /**////
    /// 获取特定的日志集
    ///
    /// 操作人
    /// 开始时间
    /// 结束时间
    /// 排序字段
    /// 0-降序,1-升序
    /// 页码
    /// 页行数
    /// 总记录数
    ///
    public static ArrayList GetList(string strOperator,DateTime dtStartTime,DateTime dtEndTime,string strOrderField,int intASC, int PageIndex, int rowCount, out int recordSum)
    ...{
        return DataAccess.QueryLog(strOperator,dtStartTime,dtEndTime,strOrderField, intASC, PageIndex, rowCount, out recordSum);
    }
}
前台页 Default.aspx

   
    ...
    
    body {...}{
    font-size: 12px;
    color: #525252;
    }
td {...}{
    font-size: 12px;
    color: #525252;
}
th {...}{
    font-size: 12px
}
a:link {...}{
    color: #000000; text-decoration: none
}
a:visited {...}{
    color: #525252; text-decoration: none
}
a:hover {...}{
    color: #0095A7; text-decoration: underline
}
td.alt_1 {...}{
 border-top: 1px solid #d6d6d6;
 border-right: 1px solid #d6d6d6;
 font-size:12px;
 color: #4f6b72;
}
td.alt_2 {...}{
 border-top: 1px solid #d6d6d6;
 border-right: 1px solid #d6d6d6;
}
td.alt_3 {...}{
 border-left: 1px solid #d6d6d6;
 border-bottom: 1px solid #d6d6d6;
}
td.alt_4 {...}{
 border-left: 1px solid #d6d6d6;
 border-right: 1px solid #d6d6d6;
}
    
    
   ...
     //author: EvoRul  date:2007-03-25
       var PageIndex=1;
    
       function QueryServer(objOperator,objStartTime,objEndTime,intIndex,boolReset)
        ...{
            context = gridspan;
            context.innerHTML = "数据加载中...";
            arg = "ServerMethodQuery|" + objOperator.value.replace(/$/g,"")+"$"+ objStartTime.value.replace(/$/g,"")+"$"+ objEndTime.value.replace(/$/g,"") +"$"+ intIndex.toString().replace(/$/g,"")+"$"+ boolReset.toString().replace(/$/g,"");
            ;
            
        }        function ReceiveServerData(result, context)
        ...{
           context.innerHTML = (result.split($))[0];
           var t1=document.getElementById("RecordSum");
           var t2=document.getElementById("PageSum");
           var t3=document.getElementById("CurrentPage");
           var t5=document.getElementById("LinkUp");
           var t6=document.getElementById("Linkdown");
          
           var t7=document.getElementById("DownListIndex");
          
           t1.innerHTML = (result.split($))[1];
           t2.innerHTML = (result.split($))[2];
           t3.innerHTML = (result.split($))[3];
          
           PageIndex=eval((result.split($))[3]);
          
           if(PageIndex>1)
           ...{
             t5.innerHTML="上一页";
           }
           else
             t5.innerHTML = "上一页";
            
           if(PageIndex4)
           ...{
              var t4=document.getElementById("SpanIndex");
              t4.innerHTML = (result.split($))[4];
           }
          
           t7.value=PageIndex;
        }
        
        function functionPageload()
        ...{
          if(document.readyState!="complete") return;
            context = gridspan;
             arg = "ServerMethodQuery|" +"$"+"1753-1-1"+ "$"+"9999-12-31"+ "$"+ "1"+"$"+ "true";
            ;
            //页面加载完后执行的代码
        }        //页面加载状态改动时执行的方法
        document.onreadystatechange=functionPageload;
    


    

   
      
                 

            [td]
             

              
                                                                           

                       [td][/td]                        [td]
                           日志查询[/td]                    

                       [td]
                                                                                       

                                   [td]
                                       操作人员:[/td]                                    [td]
                                        [/td]                                    [td]
                                       操作时间:[/td]                                    [td]
                                        -[/td]                                

                       [/td]                    

                       [td]
                                                                                                       
                            

                                   [td] [/td]                                    [td][/td]                                

                       [/td]                    

               
               
                    
                    
                    
                    
                        
                           
                                 >
                            
                        

                       
                           
                                 >
                            
                        

                       
                           
                                 >
                            
                        

                       
                           
                                 >
                            
                        

                   
                    
                    

                

               
                                                   

                        [td]
                            共有条页结果
                                 当前显示为第页   15条/页  
                             上一页
                             下一页
                             跳转至第

           
                        
[/td]                    

               
                

                   
                        

                    
                               [/td]            

   
    
    


Default.aspx.cs using System;
using System.Data;
using System.Configuration;
using System.web;
using System.IO;
using System.Text;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Globalization;
public partial class _Default : System.Web.UI.Page,ICallbackEventHandler
...{
    protected void Page_Load(object sender, EventArgs e)
    ...{
        this.Submit.Attributes.Add("onclick", "QueryServer(txtOperator,TxtStartTime,TxtEndTime,1,"true");return false;");
        this.DownListIndex.Attributes.Add("onchange", "QueryServer(txtOperator,TxtStartTime,TxtEndTime,this.value,"false");return false;");
    }
   回调分页#region  回调分页
    private string serverReturn;
   public string GetCallbackResult()
    ...{
       string[] parts = serverReturn.Split(|);
        //根据传递的方法名进行调用,并传递相应的参数,目前只支持一个参数
        return (string)GetType().GetMethod(parts[0]).Invoke(this, new object[] ...{ parts[1] });
    }
   public void RaiseCallbackEvent(string eventArgument)
    ...{
        serverReturn = eventArgument;
    }
   /**////
    /// 根据从客户端传来的值,对GridView的内容进行更新,并将更新后的GridView的html返回
    ///
    ///
    ///

   public string ServerMethodQuery(string arg)
    ...{
        Logs.DataSourceID = "DataSourceLog";

       string[] arrayArg = arg.Split($);
        this.txtOperator.Text = arrayArg[0];
        this.TxtStartTime.Text= arrayArg[1];
        this.TxtEndTime.Text = arrayArg[2];

       intialPageSelect();
        this.DownListIndex.SelectedValue = arrayArg[3];
        Logs.DataBind();

       //传入客户端字符串,并用"$"分割
        StringBuilder strHtml = new StringBuilder();
        strHtml.Append(RenderControl(Logs));
        strHtml.Append("$");
        strHtml.Append(DataLogic.recordSum.ToString());
        strHtml.Append("$");
        strHtml.Append(Convert.ToString(DataLogic.recordSum / DataAccess.RowsPerPage + 1));
        strHtml.Append("$");
        strHtml.Append(arrayArg[3]);
        if (arrayArg[4] == "true")
        ...{
            strHtml.Append("$");

           intialPageSelect();
            strHtml.Append(RenderControl(DownListIndex));
        }

       return strHtml.ToString();
    }

   private string RenderControl(Control control)
    ...{
        StringWriter writer1 = new StringWriter(CultureInfo.InvariantCulture);
        HtmlTextWriter writer2 = new HtmlTextWriter(writer1);

       control.RenderControl(writer2);
        writer2.Flush();
        writer2.Close();

       return writer1.ToString();
    }

   /**////
    /// 初始化页下拉单
    ///
    private void intialPageSelect()
    ...{
        DownListIndex.Items.Clear();
        for (int i = 0; i < (DataLogic.recordSum / DataAccess.RowsPerPage + 1); i++)
        ...{
            this.DownListIndex.Items.Add(Convert.ToString(i + 1));
        }

   }
    #endregion
}
 如有错误,欢迎指正!


喜欢0 评分0
游客

返回顶部