精灵王
- 注册日期2010-12-08
- 发帖数640
- QQ
- 火币1103枚
- 粉丝120
- 关注75
|
阅读:3179回复: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;
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 } 如有错误,欢迎指正!
| |  | |  |
|