Extjs學習總結之23EditGridPanel可編輯表格

 

[javascript] view plaincopyprint?
  1. Ext.onReady(function(){  
  2.     /* 
  3.      * EditorGridPanel的工作過程 
  4.      * 1、用戶點擊單元格 
  5.      * 2、單元格按照預設的組件顯示單元格的內容並處於編輯狀態 
  6.      * 3、離開單元格的編輯狀態 
  7.      * 4、更新編輯後的內容,出現三角號表示已經被修改過 
  8.      * 5、程序內部變化:將記錄設置爲髒讀數據狀態,並將修改後的記錄存放在Record類型的數組modified中。 
  9.      */  
  10.       
  11.       
  12.     //準備數據  
  13.     var data = [  
  14.         {id:1,date:new Date(),name:"呂鵬",address:"中華人民共和國",bank:"中國光大銀行",isFast:true},  
  15.         {id:2,date:new Date(),name:"張三",address:"中華人民共和國",bank:"中國農業銀行",isFast:false},  
  16.         {id:3,date:new Date(),name:"李四",address:"中華人民共和國",bank:"中國商業銀行",isFast:false},  
  17.         {id:4,date:new Date(),name:"王五",address:"中華人民共和國",bank:"中國招商銀行",isFast:false}  
  18.     ];  
  19.     //Proxy  
  20.     var proxy = new Ext.data.MemoryProxy(data);  
  21.     //描述數據結構  
  22.     var Order = Ext.data.Record.create(  
  23.         [  
  24.             {name:"ID",type:"int",mapping:"id"},//編號  
  25.             {name:"DATE",type:"date",mapping:"date"},//日期  
  26.             {name:"NAME",type:"string",mapping:"name"},//姓名  
  27.             {name:"ADDRESS",type:"string",mapping:"address"},//地址  
  28.             {name:"BANK",type:"string",mapping:"bank"},//銀行  
  29.             {name:"ISFAST",type:"boolean",mapping:"isFast"}//銀行  
  30.         ]  
  31.     );  
  32.     //Reader  
  33.     var reader = new Ext.data.JsonReader({},Order);  
  34.     //Store  列模型中的dataIndex必須和Human結構中的name屬性保持一致  
  35.     var store = new Ext.data.Store({  
  36.         proxy:proxy,  
  37.         reader:reader,  
  38.         autoLoad:true,  
  39.         pruneModifiedRecords:true  
  40.     });  
  41.       
  42.     //交易銀行  
  43.     var banks = [  
  44.         ["中國光大銀行","中國光大銀行"],  
  45.         ["中國農業銀行","中國農業銀行"],  
  46.         ["中國商業銀行","中國商業銀行"],  
  47.         ["中國招商銀行","中國招商銀行"]  
  48.     ]  
  49.       
  50.     //列模型  
  51.     var cm = new Ext.grid.ColumnModel([  
  52.         {header:"訂單編號",dataIndex:"ID",width:60,editor:new Ext.grid.GridEditor(new Ext.form.NumberField({allowBlank:false}))},  
  53.         {header:"下單日期",dataIndex:"DATE",width:140,renderer:new Ext.util.Format.dateRenderer("Y-m-d"),editor:new Ext.grid.GridEditor(new Ext.form.DateField({  
  54.             format:"Y-m-d"  
  55.         }))},  
  56.         {header:"收貨人姓名",dataIndex:"NAME",width:120,editor:new Ext.grid.GridEditor(new Ext.form.TextField())},  
  57.         {header:"收貨人地址",dataIndex:"ADDRESS",editor:new Ext.grid.GridEditor(new Ext.form.TextField())},  
  58.         {header:"交易銀行",dataIndex:"BANK",width:120,editor:new Ext.grid.GridEditor(new Ext.form.ComboBox({  
  59.             store:new Ext.data.SimpleStore({  
  60.                 fields:["value","text"],  
  61.                 data:banks  
  62.             }),  
  63.             displayField:"text",  
  64.             valueField:"value",  
  65.             mode:"local",  
  66.             triggerAction:"all",  
  67.             readOnly:true,  
  68.             emptyText:"請選擇銀行"  
  69.               
  70.         }))},  
  71.         {header:"快遞",dataIndex:"ISFAST",width:70,renderer:function(v){return v?"快遞":"非快遞"},editor:new Ext.grid.GridEditor(new Ext.form.Checkbox())}  
  72.     ]);  
  73.     //EditorGridPanel定義  
  74.     var grid = new Ext.grid.EditorGridPanel({  
  75.         store:store,  
  76.         cm:cm,  
  77.         autoExpandColumn:"ADDRESS",  
  78.         width:800,  
  79.         autoHeight:true,  
  80.         renderTo:"a",  
  81.         autoEncode:true//提交時是否自動轉碼  
  82.         tbar:[{  
  83.             text:"添加一行",  
  84.             cls:"x-btn-text-icon",  
  85.             handler:function(){  
  86.                 var initValue = {  
  87.                         ID:"",  
  88.                         DATE:new Date(),  
  89.                         NAME:"",  
  90.                         ADDRESS:"",  
  91.                         BANK:"",  
  92.                         ISFAST:false  
  93.                     };  
  94.                       
  95.                 var order = new Order(initValue);  
  96.                 grid.stopEditing();  
  97.                 grid.getStore().add(order);  
  98.                   
  99.                 //設置髒數據  
  100.                 order.dirty = true;  
  101.                 //只要一個字段值被修改了,該行的所有值都設置爲髒讀標記  
  102.                 order.modified = initValue;  
  103.                 if(grid.getStore().modified.indexOf(order) == -1){  
  104.                     grid.getStore().modified.push(order);  
  105.                 }  
  106.             }  
  107.               
  108.         },{  
  109.             text:"刪除一行",  
  110.             cls:"x-btn-text-icon",  
  111.             handler:function(){  
  112.                 var sm = grid.getSelectionModel();  
  113.                 if(sm.hasSelection()){  
  114.                     Ext.Msg.confirm("提示","真的要刪除選中的行嗎?",function(btn){  
  115.                         if(btn == "yes"){  
  116.                             var cellIndex = sm.getSelectedCell();//獲取被選擇的單元格的行和列索引  
  117.                             var record = grid.getStore().getAt(cellIndex[0]);  
  118.                             grid.getStore().remove(record);  
  119.                         }  
  120.                     });  
  121.                 }else{  
  122.                     Ext.Msg.alert("錯誤","請先選擇刪除的行,謝謝");  
  123.                 }  
  124.             }  
  125.         },"-",{  
  126.             text:"保存",  
  127. //          icon:"",  
  128.             cls:"x-btn-text-icon",  
  129.             handler:function(){  
  130.                 var store = grid.getStore();  
  131.                 //得到修改過的Recored的集合  
  132.                 var modified = store.modified.slice(0);  
  133.                 //將數據放到另外一個數組中  
  134.                 var jsonArray = [];  
  135.                 Ext.each(modified,function(m){  
  136.                     //alert(m.data.ADDRESS);//讀取當前被修改的記錄的地址  
  137.                     //m.data中保存的是當前Recored的所有字段的值json,不包含結構信息  
  138.                     jsonArray.push(m.data);  
  139.                 });  
  140.                   
  141.                 var r = checkBlank(modified);  
  142.                 if(!r){  
  143.                     return;  
  144.                 }else{  
  145.                     //通過ajax請求將修改的記錄發送到服務器最終影響數據庫  
  146.                     Ext.Ajax.request({  
  147.                         method:"post",//最好不要用get請求  
  148.                         url:"../../../editGridServlet",  
  149.                         success:function(response,config){  
  150.                             var json = Ext.util.JSON.decode(response.responseText);  
  151.                             //grid.getStore().reload();  
  152.                             Ext.Msg.alert("提交成功",json.msg);  
  153.                         },  
  154.                         params:{data:Ext.util.JSON.encode(jsonArray)}  
  155.                           
  156.                     });  
  157.                 }  
  158.             }  
  159.         }]  
  160.     });  
  161.     //刪除一行時,同步數據庫  
  162.     grid.getStore().on("remove",function(s,record,index){  
  163.         var jsonArray = [record,data];//因爲servlet只處理數組,所以先變成數組  
  164.         if(record.data.ID != ""){  
  165.             Ext.Ajax.request({  
  166.                 method:"post",  
  167.                 url:"../../../editGridServlet",  
  168.                 params:{data:Ext.util.JSON.encode(jsonArray),action:"delete"},  
  169.                 success:function(response,config){  
  170.                     var msg = Ext.util.JSON.decode(response.responseText);  
  171.                     //grid.getStore().reload();  
  172.                     Ext.Msg.alert("",msg.msg);  
  173.                 }  
  174.             });  
  175.         }  
  176.     });  
  177.       
  178.     //驗證是否輸入的數據是有效的  
  179.     var checkBlank = function(modified/*所有編輯過的和新增加的Record*/){  
  180.         var result = true;  
  181.         Ext.each(modified,function(record){  
  182.             var keys = record.fields.keys;//獲取Record的所有名稱  
  183.             Ext.each(keys,function(name){  
  184.                 //根據名稱獲取相應的值  
  185.                 var value = record.data[name];  
  186.                 //找出指定名稱所在的列索引  
  187.                 var colIndex = cm.findColumnIndex(name);  
  188.                 //var rowIndex = grid.getStore().indexOfId(record.id);  
  189.                   
  190.                 //根據行列索引找出組件編輯器  
  191.                 var editor = cm.getCellEditor(colIndex).field;  
  192.                 //驗證是否合法  
  193.                 var r = editor.validateValue(value);  
  194.                 if(!r){  
  195.                     Ext.MessageBox.alert("驗證","對不起,您輸入的數據非法");  
  196.                     result = false;  
  197.                     return;  
  198.                 }  
  199.                   
  200.             });  
  201.         });  
  202.         return result;  
  203.     }  
  204. });

發佈了12 篇原創文章 · 獲贊 16 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章