<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JAVA—咖啡館

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

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

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

    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.   

     

    先說一下數據的取得,上面

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

    是從一個xml文件中取得數據,這個方法的實現基于ajax,下面是dhtmlXCommon.js中的發送請求的實現:
    代碼
    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()方法向服務器端發送請求,如:
    代碼
    1. mygrid.loadXML("aaaa.do?para1=para1&2=para2");  

    服務器端可以有多種方式處理請求,我使用的java來處理的,接收請求后根據需要構建返回客戶端的數據,我采用的是用Jdom生成XML文件流的方式;然后用XMLOutputter將生成的數據文件發送給客戶端,dhtmlXGrid 會自己解析數據,顯示數據!
    下面是發送數據的代碼:
    代碼
    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);//在控制臺輸出,查看構建的xml文件是否正確規范   
    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. 數據保存及信息反饋

     

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

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

     

    3. 其他問題

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

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

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

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

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


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

    Feedback

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

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

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

    主站蜘蛛池模板: 国产A∨免费精品视频| 久久精品国产精品亚洲蜜月 | 久久青青草原亚洲av无码| 亚洲色大成WWW亚洲女子| 日本高清在线免费| 77777_亚洲午夜久久多人| 久久久久久国产精品免费无码| 亚洲大成色www永久网站| a级毛片在线视频免费观看| 日韩亚洲变态另类中文| 成av免费大片黄在线观看| 综合亚洲伊人午夜网| 成人免费黄色网址| 中日韩亚洲人成无码网站| 四虎成人免费大片在线| 亚洲国产av玩弄放荡人妇| 免费一级做a爰片性色毛片| 美女免费精品高清毛片在线视| 免费乱码中文字幕网站| 日韩免费视频一区二区| 亚洲综合一区二区精品久久| 色窝窝免费一区二区三区| 亚洲av午夜电影在线观看| 亚洲А∨精品天堂在线| 四虎影视无码永久免费| 亚洲成年网站在线观看| 亚洲AV永久无码精品| 国产色爽免费视频| a成人毛片免费观看| 亚洲成Av人片乱码色午夜| 国产精品二区三区免费播放心| 99精品视频在线视频免费观看 | 亚洲第一黄片大全| 色窝窝免费一区二区三区| 久久国产乱子伦精品免费看| 人妻巨大乳hd免费看| 亚洲国产高清在线| 日本特黄特色aa大片免费| 两个人看的www免费| 四虎影视久久久免费| 亚洲AV无码专区在线电影成人|