最近一段时间一直在看Ajax书籍,但是始终没有真正做过一个属于自己的一个程序,总以为就那回事。其实每个人的想法都是一样,眼高手底的在做事情,每件事件只有动手去做的时候才知道不是想象的那么简单,只要自己动手去做不论做的是好是坏,我想得到的始终是属于自己的东西。自己也会从中受益很多。 这样的程序实现起来很简单,但是当大家开始动手来做的时候,就知道也不是想想的那么简单了。一个是要对编写XSLT文件的语法熟悉,二是对javascript 读取XML的知识也要精通,三是程序的兼容性。还好这些曾经都浏览过。接着把这些技术都整合到一起,呵呵就成了。网上也有很多这样的程序。但是我始终相信自己不论做的是好是坏,只要自己做做来,那就是属于自己的。开始做的时候编写xslt文件时,不小心里面少写了一个字母,把我折腾了半天就是不显示数据,程序和javascript语句都没有问题查来查去就是不知道错误在哪。真够晕的。出去抽了一支烟苦思冥想问题会出在哪呢。然后自己一步一步的排查,把XSLT文件打开一点一点的查,呵呵终于水落石出。改完之后哈哈数据终于肯出来了。 数据显示出来我们就可以处理下一步。数据的分页显示。我采用的是SQL分页,用javascript 异步传输页数和接收数据这种方式最大的好处是实现起来比较简单。但是它的缺点在于每次翻页都要从数据库读取数据。我现在也在尝试着用XSLT文件来控制分页,有知道如何用XSLT文件来控制分页的朋友,不妨说出您的想法,只有集思广益大家才都会受益。 SQL 语句如下
ALTER PROCEDURE [dbo].[spAll_pagination] /*名称:spAll_pagination EXEC spAll_pagination 'SELECT * FROM 表名', 页号, 返回记录数, '主键', '排序字段' spAll_ReturnRows 'SELECT * FROM table',2,10,'[ID]','[ID]' 说明:通用存储过程.分页存储过程..返回指定返回条数、指定页数的记录*/ ( @SQL nVARCHAR(4000), @Page int, @RecsPerPage int, @ID VARCHAR(255), @Sort VARCHAR(255) ) AS DECLARE @Str nVARCHAR(4000) SET @Str='SELECT TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM ('+@SQL+') T WHERE T.'+@ID+' NOT IN (SELECT TOP '+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') T9 ORDER BY '+@Sort+') ORDER BY '+@Sort --print @str EXEC sp_ExecuteSql @Strjavascript 代码如下:
<script language="javascript"> function Add_Dispose() { var dispose_feeid=document.getElementById("tb_Disposefee"); if(dispose_feeid.value=="") { alert('请填写处理编号'); dispose_feeid.focus(); return false; } var rad_type; if(document.getElementById("rad_fee").checked) { rad_type="费用报销"; } else if(document.getElementById("rad_skkp").checked) { rad_type="收款开票"; } else if(document.getElementById("rad_FKSP").checked) { rad_type="付款收票"; } else { alert('请选择处理类型'); return false; } var userid=document.getElementById("hid_userid"); var DisposeIntro=document.getElementById("tb_disposeintro"); // alert(rad_type); cw_Dispose_Sq.AddDispose(dispose_feeid.value,rad_type,DisposeIntro.value,userid.value,Add_Dispose_callbak); } function Add_Dispose_callbak(response) { //alert(response.value); if(response.value=="0") { alert('提交成功!'); var dispose_feeid=document.getElementById("tb_Disposefee"); dispose_feeid.value=""; var DisposeIntro=document.getElementById("tb_disposeintro"); DisposeIntro.value=""; Dispose_Sel('No'); } else { alert('提交失败,请重新提交!'); } } var pageno=1 function Dispose_Sel(Type) { //var pagesize=document.getElementById("lb_pagesize"); var pagesize=document.getElementById("tb_pagesize"); var count=cw_Dispose_Sq.GetCount(1).value; var lb_count=document.getElementById("lb_count"); var pagecount=Math.ceil(count/pagesize.value); //alert(pagecount); var lb_pagecount=document.getElementById("lb_pagecount"); lb_pagecount.innerHTML=pagecount; lb_count.innerHTML=count; if(Type=="NEXT") { if (pageno==pagecount) { pageno==pagecount; } else { pageno=pageno+1; } } else if(Type=="PREV") { if(pageno==1) { pageno==1 } else { pageno=pageno-1; } } else if(Type=="EOF") { pageno=pagecount; } else if(Type=="BOF") { pageno=1; } else { pageno=1; } var lb_page=document.getElementById("lb_page"); lb_page.innerHTML=pageno; cw_Dispose_Sq.GetDispose(parseInt(pageno),pagesize.value,Dispose_Sel_callbak); } function Dispose_Sel_callbak(response) { //alert(response.value); var xml=response.value; // alert(xml); var xmldoc=new ActiveXObject("MSXML2.DOMDocument"); // alert(xmldoc); // alert(xmldoc); xmldoc.async=false; xmldoc.loadXML(xml); var xsldoc=new ActiveXObject("MSXML2.DOMDocument"); xsldoc.async=false; xsldoc.load("../css/dispose.xsl"); //document.write(xmldoc.transformNode(xsldoc)); // xml.transformNode( var div2=document.getElementById("div2"); div2.innerHTML=xmldoc.transformNode(xsldoc); // div2.innerHTML(xmldoc.transformNode(xsldoc)); } // function ReturnActive() // { // var arr=new Array("Microsoft.XMLDOM"); // for(int i=0;i<arr.length;i++) // { // try // { // var xmldoc=new ActiveXObject(arr[i]); // return xmldoc; // // } // catch() // { // // } // } // } </script>后台处理程序:
[AjaxPro.AjaxMethod]
public string GetDispose(int pageno, int pagesize)
{
my_conn = ofen.ConnOpen();
SqlCommand my_cmd = new SqlCommand("DD_DisposeSel", my_conn);
my_cmd.CommandType = CommandType.StoredProcedure;
SqlParameter my_userid = my_cmd.Parameters.Add("@userid", SqlDbType.VarChar, 50);
SqlParameter my_pageno = my_cmd.Parameters.Add("@page", SqlDbType.Int);
SqlParameter my_pagesize = my_cmd.Parameters.Add("@pagesize", SqlDbType.Int);
my_userid.Value = "ceshi";
my_pageno.Value =pageno;
my_pagesize.Value =pagesize;
SqlDataAdapter my_apter = new SqlDataAdapter(my_cmd);
DataSet ds=new DataSet();
my_apter.Fill(ds);
//SqlParameter[] dlist ={
// new SqlParameter("@userid",SqlDbType.VarChar,20),
// new SqlParameter("@pageno",SqlDbType.Int),
// new SqlParameter("@pagesize",SqlDbType.Int)
//};
//dlist[0].Value = "ceshi";
//dlist[1].Value = pageno;
//dlist[2].Value = pagesize;
//DataSet ds =null;
//ds=SqlHelper.RunProcedure("DD_DisposeSel", my_conn, dlist, "dispose");
return ds.GetXml();
}
[AjaxPro.AjaxMethod]
public int AddDispose(string feeid, string disposetype, string disposeIntro,string userid)
{
my_conn = ofen.ConnOpen();
SqlParameter[] dlist ={
new SqlParameter("@disposefeeid",SqlDbType.Int),
new SqlParameter("@disposetype",SqlDbType.VarChar,20),
new SqlParameter("@disposeIntro",SqlDbType.VarChar,100),
new SqlParameter("@userid",SqlDbType.VarChar,50),
new SqlParameter("@ret",SqlDbType.Int)
};
dlist[0].Value = Convert.ToInt32(feeid);
dlist[1].Value = disposetype;
dlist[2].Value = disposeIntro;
dlist[3].Value =userid;
dlist[4].Direction = ParameterDirection.Output;
SqlHelper.ExecuteProcedure("DD_DisposeAdd", my_conn, dlist);
int ret = Convert.ToInt32(dlist[4].Value);
return ret;
}
[AjaxPro.AjaxMethod]
public int GetCount(int page)
{
int pagecount=0;
string sql = "select count(*)as pagecount from dd_DisposeFee where DisposeUser='baojiazhi'";
SqlDataReader my_dr = ofen.DatajeSq(sql);
if (my_dr.Read())
{
pagecount = Convert.ToInt32(my_dr["pagecount"].ToString());
}
else
{
pagecount = 0;
}
return pagecount;
}
有时间我会修改一下程序的兼容性,此程序在IE下执行正常,Mozilla 不正常,欣慰Mozilla读取XML语法也IE 不一样。呵呵。有不对或需要改进的地方希望大家多多指出。