您的位置:首页 > 其它

客户端回调实现gridView无刷新分页

2007-03-30 00:33 204 查看
由于客户对速度和性能上的要求越来越变态,而数据量一天天的庞大,因此本人产生了数据的查询和分页完全由客户端回调来实现。想法看上去复杂,实现起来也不难。废话不多说,看程序吧。

一、存储过程

包头:


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;






/**//// <summary>


///数据层 author: EvoRul date:2007-03-29


/// </summary>


public class DataAccess




...{






/**//// <summary>


/// 返回数据库连接字符串


/// </summary>


public static String DatabaseConnectionString




...{


get




...{


NameValueCollection configSettings = (NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings");


return configSettings["connectionString"];


}


}






/**//// <summary>


/// 返回每一页显示的纪录数


/// </summary>


public static int RowsPerPage




...{


get




...{


NameValueCollection configSettings = (NameValueCollection)System.Configuration.ConfigurationManager.GetSection("appSettings");


return Convert.ToInt32(configSettings["rowsPerPage"]);


}


}






/**//// <summary>


/// 获取特定日志集合


/// </summary>


/// <param name="typeID">日志类型</param>


/// <param name="userID">操作人</param>


/// <param name="strOrderField">排序字段</param>


/// <param name="intASC">是否升序 0-降序,1-升</param>


/// <param name="PageIndex">页码</param>


/// <param name="rowCount">页行数</param>


/// <param name="recordSum">符合条件的总记录数</param>


/// <returns></returns>


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;






/**//// <summary>


/// 业务逻辑层 author: EvoRul date:2007-03-29


/// </summary>


public class DataLogic




...{


public DataLogic()




...{


}




public static int recordSum = 0;








/**//// <summary>


/// 查询日志


/// </summary>


/// <param name="strOperator">操作人</param>


/// <param name="dtStarTime">时间范围下限</param>


/// <param name="dtEndTime">时间上限</param>


/// <param name="Pageid">页码</param>


/// <returns></returns>


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;






/**//// <summary>


/// 日志类


/// </summary>


public class Log




...{


// ============================== 成员 ==============================




protected string operationType;




/**//// <summary>


/// 时间


/// </summary>


protected DateTime time = new DateTime();






/**//// <summary>


/// 用户


/// </summary>


protected string m_operator;






/**//// <summary>


/// 信息


/// </summary>


protected string info = "";






// ============================== 属性 ==============================




public string OperationType




...{




get ...{ return operationType; }




set ...{ operationType = value; }


}




/**//// <summary>


/// 时间


/// </summary>


public DateTime Time




...{




get ...{ return time; }




set ...{ time = value; }


}








/**//// <summary>


/// 用户


/// </summary>


public string Operator




...{




get ...{ return m_operator; }




set ...{ m_operator = value; }


}






/**//// <summary>


/// 信息


/// </summary>


public string Info




...{




get ...{ return info; }




set ...{ info = value; }


}




// ============================== 方法 ==============================






/**//// <summary>


/// 创建空日志实例


/// </summary>


public Log()




...{


}






/**//// <summary>


/// 新增日志


/// </summary>


public void Add()




...{


try




...{


// 暂不支持该方法


throw new Exception("新增日志");


}


catch (Exception ex)




...{


throw (ex);


}


}






/**//// <summary>


/// 修改日志(不支持)


/// </summary>


public void Modify()




...{


// 暂不支持该方法


throw new Exception("修改日志");


}






/**//// <summary>


/// 删除日志


/// </summary>


public void Del()




...{


// 暂不支持该方法


throw new Exception("修改日志");


}






/**//// <summary>


/// 获取特定的日志集


/// </summary>


/// <param name="strOperator">操作人</param>


/// <param name="dtStartTime">开始时间</param>


/// <param name="dtEndTime">结束时间</param>


/// <param name="strOrderField">排序字段</param>


/// <param name="intASC">0-降序,1-升序</param>


/// <param name="PageIndex">页码</param>


/// <param name="rowCount">页行数</param>


/// <param name="recordSum">总记录数</param>


/// <returns></returns>


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




<%...@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">




<html xmlns="http://www.w3.org/1999/xhtml" >


<head runat="server">


<title>客户端回调</title>




<style type="text/css">...






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;


}


</style>






<script type="text/javascript">...


//author: EvoRul date:2007-03-25


var PageIndex=1;




function QueryServer(objOperator,objStartTime,objEndTime,intIndex,boolReset)




...{


context = gridspan;


context.innerHTML = "<IMG SRC='../images/pie.gif' />数据加载中...";


arg = "ServerMethodQuery|" + objOperator.value.replace(/$/g,"")+"$"+ objStartTime.value.replace(/$/g,"")+"$"+ objEndTime.value.replace(/$/g,"") +"$"+ intIndex.toString().replace(/$/g,"")+"$"+ boolReset.toString().replace(/$/g,"");


<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;




}




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="<a href="#" onclick="QueryServer(txtOperator,TxtStartTime,TxtEndTime,"+(PageIndex-1).toString()+",'false')">上一页</a>";


}


else


t5.innerHTML = "上一页";




if(PageIndex< eval((result.split('$'))[2]))




...{


t6.innerHTML="<a href="#" onclick="QueryServer(txtOperator,TxtStartTime,TxtEndTime,"+(PageIndex+1).toString()+",'false')">下一页</a>";


}


else


t6.innerHTML="下一页";






if(result.split('$').length>4)




...{


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";


<%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;


//页面加载完后执行的代码


}




//页面加载状态改变时执行的方法


document.onreadystatechange=functionPageload;


</script>


</head>


<body>


<form id="form1" runat="server">


<div>


<table style="width:100%; background-color:#ffffff; margin: 0px;" cellpadding="0" cellspacing="0" border="0" id="table1">


<tr>


<td style="width:102%; height: 445px;" align="center" valign="top">


<br />


<table cellpadding="0" cellspacing="0" border="0" width="95%">


<tr>


<td><img src="../images/round-1.gif" width="13" height="30" alt="" /></td>


<td style="width:100%;background-color:#efefef;" class="alt_1">


日志查询</td>


</tr>


<tr>


<td class="alt_4" valign="top" colspan="2" align="center">


<table cellpadding="0" cellspacing="0" border="0" width="95%">


<tr>


<td style="width:120px; height:30px;" align="right">


操作人员:</td>


<td align="left" style="width: 143px">


 <asp:TextBox ID="txtOperator" runat="server" CssClass="border" ReadOnly="False"


Width="90px"></asp:TextBox></td>


<td style="width:71px; height:30px;" align="right">


操作时间:</td>


<td align="left">


 <asp:TextBox ID="TxtStartTime" runat="server" CssClass="border"


ReadOnly="False" Width="90px"></asp:TextBox>-<asp:TextBox


ID="TxtEndTime" runat="server" CssClass="border"


ReadOnly="False" Width="90px"></asp:TextBox></td>


</tr>


<tr>


<td colspan="4" style="background-image:url(../images/point.gif); height:12px;"></td>


</tr>


<tr>


<td colspan="4" style="height:30px; text-align: center;">


<asp:Button ID="Submit" runat="server" CssClass="btn2" Text=" 确定 " Height="20px" Width="50px" /></td>


</tr>


</table>


</td>


</tr>


<tr>


<td colspan="2" align="center">


<table cellpadding="0" cellspacing="0" border="0" width="100%">


<tr>


<td style="width:100%;" class="alt_3"> </td>


<td></td>


</tr>


</table>


</td>


</tr>


</table>


<span id="gridspan">


<asp:GridView ID="Logs" runat="server" AutoGenerateColumns="False"


GridLines="Horizontal" PageSize="15"


Width="95%" BackColor="White" BorderColor="#336666" BorderStyle="Double" BorderWidth="3px" CellPadding="4">


<RowStyle ForeColor="#333333" Height="24px" BackColor="White" />


<SelectedRowStyle BorderColor="Red" BackColor="#339966" Font-Bold="True" ForeColor="White" />


<HeaderStyle BackColor="#336666" ForeColor="White" Height="30px" Font-Bold="True" />


<AlternatingRowStyle BorderWidth="1px" />


<Columns>


<asp:TemplateField HeaderText="用户">


<ItemTemplate>


<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="" Text='<%# Eval("UserInfo.Name") %>'></asp:HyperLink>


</ItemTemplate>


</asp:TemplateField>


<asp:TemplateField HeaderText="类型">


<ItemTemplate>


<asp:HyperLink ID="HyperLink2" runat="server" NavigateUrl="" Text='<%# Eval("Type.Name") %>'></asp:HyperLink>


</ItemTemplate>


</asp:TemplateField>


<asp:TemplateField HeaderText="时间">


<ItemTemplate>


<asp:HyperLink ID="HyperLink4" runat="server" NavigateUrl="" Text='<%# Eval("Time") %>'></asp:HyperLink>


</ItemTemplate>


</asp:TemplateField>


<asp:TemplateField HeaderText="备注">


<ItemTemplate>


<asp:HyperLink ID="HyperLink5" runat="server" NavigateUrl="" Text='<%# Eval("Info") %>'></asp:HyperLink>


</ItemTemplate>


</asp:TemplateField>


</Columns>


<FooterStyle BackColor="White" ForeColor="#333333" />


<PagerStyle BackColor="#336666" ForeColor="White" HorizontalAlign="Center" />


</asp:GridView>


</span>


<table border="0" cellpadding="0" cellspacing="0" bordercolorlight="#000000" bordercolordark="#ffffff">


<tr>


<td align="center" nowrap style="height: 25px; width: 601px;">


共有<asp:Label ID="RecordSum" runat="server" />条<asp:Label ID="PageSum" runat="server" />页结果


    当前显示为第<asp:Label ID="CurrentPage" runat="server" />页   15条/页  


<asp:Label ID="LinkUp" runat="server" >上一页</asp:Label>


<asp:Label ID="Linkdown" runat="server" >下一页</asp:Label>


跳转至第<span id="SpanIndex"><asp:DropDownList ID="DownListIndex" runat="server" Width="50px">


</asp:DropDownList></span>页


</td>


</tr>


</table>




<asp:ObjectDataSource ID="DataSourceLog" runat="server" TypeName="DataLogic" SelectMethod="GetLogData">


<SelectParameters>


<asp:ControlParameter ControlID="txtOperator" DefaultValue=" " Name="strOperator" PropertyName="Text"


Type="string" />


<asp:ControlParameter ControlID="TxtStartTime" DefaultValue="1753-1-1" Name="dtStarTime"


PropertyName="Text" Type="DateTime" />


<asp:ControlParameter ControlID="TxtEndTime" DefaultValue="9999-12-31" Name="dtEndTime"


PropertyName="Text" Type="DateTime" />


<asp:ControlParameter Name="Pageid" ControlID="DownListIndex" DefaultValue="1" PropertyName="SelectedValue" Type="String" />


</SelectParameters>


</asp:ObjectDataSource>




</td>


</tr>


</table>




</div>


</form>


</body>


</html>



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;


}






/**//// <summary>


/// 根据从客户端传来的值,对GridView的内容进行更新,并将更新后的GridView的html返回


/// </summary>


/// <param name="arg"></param>


/// <returns></returns>




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();


}






/**//// <summary>


/// 初始化页下拉单


/// </summary>


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


}



如有错误,欢迎指正!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: