JAVA—咖啡館

          ——歡迎訪問rogerfan的博客,常來《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術(shù),交流工作經(jīng)驗,分享JAVA帶來的快樂!本網(wǎng)站部分轉(zhuǎn)載文章,如果有版權(quán)問題請與我聯(lián)系。

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

          前端時間在論壇里回了fins的一個帖子(http://daoger.javaeye.com/blog/40310)后,有幾個網(wǎng)友想看我的例子代碼,由于搞自己的一個小系統(tǒng)比較忙,在這里簡單說一下dhtmlXGrid的使用心得!
          我現(xiàn)在使用的版本是1.2(免費版),我的實現(xiàn)也大部分基于這個免費版,有哪位老兄能提供一份專業(yè)版的話更好了!
          1.2免費版中的一些功能其實是1.1專業(yè)版中的!廢話少說,切入正題!

          1. 基本使用方法

          dhtmlXGrid使用起來還是比較簡單的,下面是一段它自帶例子中的代碼:

          代碼
          1.      
          2. <script>  
          3.     mygrid = new dhtmlXGridObject('gridbox');   
          4.     mygrid.setImagePath("../imgs/");   
          5.     mygrid.setHeader("Sales,Book Title,Author,Price,In Store,Shipping,Bestseller,Date of Publication");   
          6.     mygrid.setInitWidths("50,150,100,80,80,80,80,200")   
          7.     mygrid.setColAlign("right,left,left,right,center,left,center,center")   
          8.     mygrid.setColTypes("dyn,ed,ed,price,ch,co,ra,ro");   
          9.     mygrid.getCombo(5).put(2,2);   
          10.     mygrid.setColSorting("int,str,str,int,str,str,str,date")   
          11.     //mygrid.setColumnColor("white,#d5f1ff,#d5f1ff")   
          12.     mygrid.setSkin("xp");   
          13.     mygrid.init();   
          14.     mygrid.loadXML("../grid.xml");   
          15. </script>  
          16.   

           

          先說一下數(shù)據(jù)的取得,上面

          代碼
          1. mygrid.loadXML("../grid.xml");  

          是從一個xml文件中取得數(shù)據(jù),這個方法的實現(xiàn)基于ajax,下面是dhtmlXCommon.js中的發(fā)送請求的實現(xiàn):
          代碼
          1. dtmlXMLLoaderObject.prototype.loadXML = function (filePath, postMode, postVars) {   
          2.     this.filePath = filePath;   
          3.     try {   
          4.         this.xmlDoc = new XMLHttpRequest();   
          5.         this.xmlDoc.open(postMode ? "POST" : "GET", filePath, this.async);   
          6.         if (postMode) {   
          7.             this.xmlDoc.setRequestHeader("Content-type""application/x-www-form-urlencoded");   
          8.         }   
          9.         this.xmlDoc.onreadystatechange = new this.waitLoadFunction(this);   
          10.         this.xmlDoc.send(null || postVars);   
          11.     }   
          12.     catch (e) {   
          13.         if (document.implementation && document.implementation.createDocument) {   
          14.             this.xmlDoc = document.implementation.createDocument(""""null);   
          15.             this.xmlDoc.onload = new this.waitLoadFunction(this);   
          16.             this.xmlDoc.load(filePath);   
          17.         } else {   
          18.             this.xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");   
          19.             this.xmlDoc.open(postMode ? "POST" : "GET", filePath, this.async);   
          20.             if (postMode) {   
          21.                 this.xmlDoc.setRequestHeader("Content-type""application/x-www-form-urlencoded");   
          22.             }   
          23.             this.xmlDoc.onreadystatechange = new this.waitLoadFunction(this);   
          24.             this.xmlDoc.send(null || postVars);   
          25.         }   
          26.     }   
          27. };   

          這樣你就可以通過這個loadXML()方法向服務(wù)器端發(fā)送請求,如:
          代碼
          1. mygrid.loadXML("aaaa.do?para1=para1&2=para2");  

          服務(wù)器端可以有多種方式處理請求,我使用的java來處理的,接收請求后根據(jù)需要構(gòu)建返回客戶端的數(shù)據(jù),我采用的是用Jdom生成XML文件流的方式;然后用XMLOutputter將生成的數(shù)據(jù)文件發(fā)送給客戶端,dhtmlXGrid 會自己解析數(shù)據(jù),顯示數(shù)據(jù)!
          下面是發(fā)送數(shù)據(jù)的代碼:
          代碼
          1. xmlDocument = new Document(rowsElement);   
          2.         XMLOutputter outputter = new XMLOutputter();   
          3.         try   
          4.         {   
          5.             response.setContentType("text/xml; charset=UTF-8");   
          6.             response.setHeader("Cache-Control", "no-cache");   
          7.             outputter.output(xmlDocument, response.getWriter());   
          8.             // outputter.output(xmlDocument, System.out);//在控制臺輸出,查看構(gòu)建的xml文件是否正確規(guī)范   
          9.         } catch (IOException e)   
          10.         {   
          11.             log.error(e);   
          12.             try   
          13.             {   
          14.                 response.getWriter().write("<flag>0</flag>");   
          15.             } catch (Exception fe)   
          16.             {   
          17.             }   
          18.         }   

          2. 數(shù)據(jù)保存及信息反饋

           

          由于版本限制,免費版中沒有提供數(shù)據(jù)保存的api,在專業(yè)版中還有用.net和php實現(xiàn)的服務(wù)器端實例代碼;這一功能我是根據(jù)dhtmlXGrid提供的api自己用ajax實現(xiàn)的:

          代碼
          1. //deal with data from mygrid   
          2. document.write("<script type='text/javascript' src='script/prototype/infodialog.js'></script>");   
          3. function mydataProcessorObject() {   
          4.     var imagesurl = "script/dhtmlXGrid/images/";   
          5.     var xmlHttp;//request and response    
          6.     var mygrid = new dhtmlXGridObject("gridbox");   
          7.     this.dealServer = "";//   
          8.     this.querycondithon = "";   
          9.     this.dataXml = "";   
          10.     this.checkFlag = "";//whether check the cell is null   
          11.     this.header = "";   
          12.     var newcell;//new record eg."","","","", and so on   
          13.     var alertInfotimeout = 3;//alert info show time   
          14.     var haveSaved = false;   
          15.     this.setDealServer = function (server) {   
          16.         this.dealServer = server;   
          17.     };   
          18.     this.setQueryCondition = function (condition) {   
          19.         this.querycondithon = condition;   
          20.     };   
          21.     /////////////////////////////////////////////////////////   
          22.     this.init = function (para) {   
          23.         if (para == "query") {   
          24.             if (this.querycondithon.length === 0 || this.querycondithon == "" || this.querycondithon == null) {   
          25.                 mygrid.setImagePath(imagesurl);   
          26.                 mygrid.enableLightMouseNavigation(true);   
          27.                 mygrid.loadXML(this.dealServer + "?action=query&ts=" + new Date().getTime());   
          28.             } else {   
          29.                 mygrid.clearAll();   
          30.                 mygrid.loadXML(this.dealServer + "?action=query&ts=" + new Date().getTime() + "&" + this.querycondithon);   
          31.             }   
          32.         } else {   
          33.             if (para == "add") {   
          34.                 if (this.readyingAdd()) {   
          35.                 //mygrid.addRow("A"+(new Date()).valueOf(),['','','','','','','',''],0);   
          36.                     mygrid.addRow("A" + (new Date()).valueOf(), newcell, 0);   
          37.                 } else {   
          38.                     //alert("Exist null cell!");   
          39.                     openinfodialog("\u5b58\u5728\u7a7a\u5355\u5143\u683c\uff01", 150, 40);   
          40.                 }   
          41.             } else {   
          42.                 if (para == "save" && !haveSaved) {   
          43.                     this.readyingSave();   
          44.                 } else {   
          45.                     if (para == "delete") {   
          46.                         var iddel = mygrid.getSelectedId();   
          47.                 //just whether the record has saved or not   
          48.                         if (iddel.indexOf("A") === 0) {   
          49.                             mygrid.deleteSelectedItem();   
          50.                             openinfodialog("\u6570\u636e\u5df2\u5220\u9664\uff01", 150, 40);   
          51.                         } else {   
          52.                             this.loadDelete(iddel);   
          53.                         }   
          54.                     }   
          55.                 }   
          56.             }   
          57.         }   
          58.     };   
          59.     /////////////////////////////////////////////////////////   
          60.     this.createXMLHttpRequest = function () {   
          61.         if (window.ActiveXObject) {   
          62.             try {   
          63.                 xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");   
          64.             }   
          65.             catch (e) {   
          66.                 try {   
          67.                     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");   
          68.                 }   
          69.                 catch (e) {   
          70.                 }   
          71.             }   
          72.         } else {   
          73.             if (window.XMLHttpRequest) {   
          74.                 xmlHttp = new XMLHttpRequest();   
          75.             }   
          76.         }   
          77.     };   
          78.     /////////////////////////////////////////////////////////   
          79.     this.readyingAdd = function () {   
          80.         var allitemid = new Array(0);   
          81.         allitemid = mygrid.getAllItemIds().split(",");   
          82.         var cc = mygrid.getColumnCount();   
          83.         newnewcell = new Array(cc + 1);   
          84.         var addflag = true;   
          85.         if (allitemid.length > 0) {   
          86.             for (var i = 0; i < allitemid.length; i++) {   
          87.                 for (var j = 0; j < cc; j++) {   
          88.                     var cellValue = mygrid.cells(allitemid[i], j).getValue();   
          89.                     if (cellValue == null || cellValue.length == 0 || cellValue == "") {   
          90.                         addflag = false;   
          91.                     }   
          92.                 }   
          93.             }   
          94.         }   
          95.         if (addflag) {   
          96.             for (var n = 0; n < cc; n++) {   
          97.                 newcell[n] = "";   
          98.             }   
          99.         }   
          100.         return addflag;   
          101.     };   
          102.     /////////////////////////////////////////////////////////   
          103.     this.readyingSave = function () {   
          104.         var allitemid = new Array(0);   
          105.         var modiitemid = new Array(0);   
          106.         allitemid = mygrid.getAllItemIds().split(",");   
          107.         var cc = mygrid.getColumnCount();   
          108.         var saveflag = false;   
          109.         var blankflag = false;   
          110.         var a = 0;   
          111.         for (var i = 0; i < allitemid.length; i++) {   
          112.             var modiflag = false;   
          113.             for (var j = 0; j < cc; j++) {   
          114.                 if (mygrid.cells(allitemid[i], j).wasChanged()) {   
          115.                     modiflag = true;   
          116.                 }   
          117.                 var cellValue = mygrid.cells(allitemid[i], j).getValue();   
          118.                 if (cellValue == "" || cellValue.length == 0 || cellValue == null) {   
          119.                     blankflag = true;   
          120.                 }   
          121.             }   
          122.             if (modiflag && !blankflag) {   
          123.                 modiitemid[a++] = allitemid[i];   
          124.             }   
          125.         }   
          126.         if (this.dealServer.length > 0 && modiitemid.length > 0) {   
          127.             this.dataXml = "<?xml version='1.0' encoding='UTF-8'?><data>";   
          128.             for (var i = 0; i < modiitemid.length; i++) {   
          129.                 if (modiitemid[i].length > 0) {   
          130.                     this.dataXml += "<row id='" + modiitemid[i] + "'>";   
          131.                     for (var j = 0; j < cc; j++) {   
          132.                         this.dataXml += "<cell>";   
          133.                         var mycell = mygrid.cells(modiitemid[i], j).getValue();   
          134.                         if (mycell.indexOf("<") != -1) {   
          135.                             this.dataXml += mycell.substring(mycell.indexOf(">") + 1, mycell.indexOf("</"));   
          136.                         } else {   
          137.                             this.dataXml += mycell;   
          138.                         }   
          139.                         this.dataXml += "</cell>";   
          140.                     }   
          141.                     this.dataXml += "</row>";   
          142.                 }   
          143.             }   
          144.             this.dataXml += "</data>";   
          145.             alert(this.dataXml);   
          146.             this.loadSave();   
          147.             this.init("query");   
          148.         } else {   
          149.             if (blankflag) {   
          150.                 openinfodialog("\u5b58\u5728\u7a7a\u503c\uff01", 100, 40);   
          151.             } else {   
          152.             //alert("u5df2u7ecfu5b58u50a8u6216u6ca1u6709u6570u636eu6539u52a8uff01");   
          153.                 openinfodialog("\u5df2\u4fdd\u5b58\u6216\u6ca1\u6709\u53ef\u4fdd\u5b58\u7684\u6570\u636e\uff01", 200, 40);   
          154.             }   
          155.         }   
          156.     };   
          157.     /////////////////////////////////////////////////////////   
          158.     this.loadSave = function () {   
          159.         this.createXMLHttpRequest();   
          160.         var url = this.dealServer + "?action=save&ts=" + new Date().getTime();   
          161.         xmlHttp.open("POST", url, false);   
          162.         xmlHttp.onreadystatechange = this.goCallBackSave;   
          163.         xmlHttp.setRequestHeader("Content-Type", "text/xml");   
          164.         xmlHttp.setRequestHeader("charset", "UTF-8");   
          165.         xmlHttp.send(this.dataXml);   
          166.     };   
          167.     /////////////////////////////////////////////////////////   
          168.     this.goCallBackSave = function () {   
          169.         if (xmlHttp.readyState == 4) {   
          170.             if (xmlHttp.status == 200) {   
          171.                 var returnFlag = xmlHttp.responseXML.getElementsByTagName("flag");   
          172.                 var saveflag = returnFlag[0].firstChild.nodeValue;   
          173.                 if (saveflag == "1") {   
          174.                     //alert("u4fddu5b58u6210u529fuff01");   
          175.                     openinfodialog("\u4fdd\u5b58\u6210\u529f\uff01", 120, 40);   
          176.                 } else {   
          177.                     if (saveflag == "0") {   
          178.                         //alert("u4fddu5b58u5931u8d25!");   
          179.                         openinfodialog("\u4fdd\u5b58\u5931\u8d25\uff01", 120, 40);   
          180.                     }   
          181.                 }   
          182.             }   
          183.         }   
          184.     };   
          185.     /////////////////////////////////////////////////////////   
          186.     this.loadDelete = function (id) {   
          187.         this.createXMLHttpRequest();   
          188.         var url = this.dealServer + "?action=delete&id=" + id + "&ts=" + new Date().getTime();   
          189.         xmlHttp.open("GET", url, true);   
          190.         xmlHttp.onreadystatechange = this.goCallBackDelete;   
          191.         xmlHttp.send();   
          192.     };   
          193.     /////////////////////////////////////////////////////////   
          194.     this.goCallBackDelete = function () {   
          195.         if (xmlHttp.readyState == 4) {   
          196.             if (xmlHttp.status == 200) {   
          197.                 var returnFlag = xmlHttp.responseXML.getElementsByTagName("flag");   
          198.                 var delflag = returnFlag[0].firstChild.nodeValue;   
          199.                 if (delflag == "1") {   
          200.                     mygrid.deleteSelectedItem();   
          201.                     //alert("ddddddddd");   
          202.                     openinfodialog("\u8bb0\u5f55\u5df2\u5220\u9664\uff01", 140, 40);   
          203.                 } else {   
          204.                     if (delflag == "0") {   
          205.                         //alert("u5220u9664u5931u8d25!");   
          206.                         openinfodialog("\u8bb0\u5f55\u672a\u80fd\u5220\u9664\uff0c\u8bf7\u68c0\u67e5\u539f\u56e0\uff01", 170, 40);   
          207.                     }   
          208.                 }   
          209.             }   
          210.         }   
          211.     };   
          212. }   
          213.   

          簡單說一下思路:通過dhtmlXGrid提供的api wasChange()來判斷是否有單元格的數(shù)據(jù)修改過,如果有修改,在客戶端構(gòu)建要保存數(shù)據(jù)的xml后,用send方式將其發(fā)送到服務(wù)器端處理,用服務(wù)器端返回的flag標(biāo)志位提示反饋信息,在提示信息顯示的同時,頁面中的腳本再向服務(wù)器端發(fā)送一次查詢請求,刷新數(shù)據(jù),顯示最新數(shù)據(jù)記錄!
          還有一個問題是:填寫完數(shù)據(jù)保存時,焦點還在表格中,這時在取數(shù)據(jù)的時候要注意清除掉<texteare>標(biāo)簽,這樣才能取到單元格的值!
          代碼中的很多方法都是來源于dhtmlXGrid的api,代碼有點亂,請盡量參考它自帶的文檔!

           

          3. 其他問題

          操作后的反饋信息我是使用的ouspec 推薦的一個小控件windows_js,現(xiàn)在的版本是1.0;這里是例子:http://prototype-window.xilinus.com/samples.html#

          另外,我還使用了yui-ext組件,由于dhtmlXGrid中日期控件是基于YUI開發(fā)的,所以兩個都使用的時候會有底層方法方面的沖突;我現(xiàn)在的解決方法是把dhtmlXGrid下js文件夾中dhtmlXGrid_excell_calendar.js文件中對event.js的引用替換為YUI包中的event.js;
          如果你有更好的解決辦法,還請告訴我!

          說得有點羅嗦,希望各位網(wǎng)友能聽的明白,用起來少走彎路!呵呵!

          #################################################################################################

          注釋:擴(kuò)展的ajax請求部分如果換成prototype的Ajax.Request會更簡潔一些。


          posted on 2007-09-03 13:51 rogerfan 閱讀(6985) 評論(3)  編輯  收藏 所屬分類: 【開源技術(shù)】

          Feedback

          # re: dhtmlXGrid應(yīng)用簡介[未登錄] 2008-01-03 09:20 vinson
          能給份擴(kuò)展完的代碼?  回復(fù)  更多評論
            

          # re: dhtmlXGrid應(yīng)用簡介[未登錄] 2008-01-03 09:27 vinson
          beijing_lan@126.com
          謝謝  回復(fù)  更多評論
            

          # re: dhtmlXGrid應(yīng)用簡介[未登錄] 2008-01-03 09:39 rogerfan
          @vinson
          非常抱歉我手頭也沒有了,這篇文章是轉(zhuǎn)載過來的。
            回復(fù)  更多評論
            

          主站蜘蛛池模板: 嵊泗县| 凤台县| 娱乐| 满洲里市| 平乡县| 昭通市| 临城县| 青川县| 乌鲁木齐县| 石首市| 光山县| 墨竹工卡县| 慈利县| 习水县| 寿光市| 武义县| 辽中县| 岐山县| 巫山县| 大悟县| 沁源县| 福泉市| 渭源县| 霍山县| 昌黎县| 洛隆县| 涡阳县| 类乌齐县| 太和县| 霍城县| 马尔康县| 鸡泽县| 抚松县| 会昌县| 崇州市| 吴旗县| 石景山区| 涟水县| 枣强县| 喀喇沁旗| 郎溪县|