建立GridPanelajax
要使用GridPanel,首先要定義Store,而在建立Store的時候必需要有Model,所以咱們首先來定義Model:服務器
//1.定義Model Ext.define("MyApp.model.User", { extend: "Ext.data.Model", fields: [ { name: 'name', type: 'string' }, { name: 'age', type: 'int' }, { name: 'phone', type: 'string' } ] });
而後建立Store:異步
//2.建立store var store = Ext.create("Ext.data.Store", { model: "MyApp.model.User", autoLoad: true, pageSize: 5, proxy: { type: "ajax", url: "GridHandler.ashx", reader: { root: "rows" } } });
接下來纔是GridPanel的代碼:編輯器
//3.建立grid var grid = Ext.create("Ext.grid.Panel", { xtype: "grid", store: store, width: 500, height: 200, margin: 30, columnLines: true, renderTo: Ext.getBody(), selModel: { injectCheckbox: 0, mode: "SIMPLE", //"SINGLE"/"SIMPLE"/"MULTI" checkOnly: true //只能經過checkbox選擇 }, selType: "checkboxmodel", columns: [ { text: '姓名', dataIndex: 'name' }, { text: '年齡', dataIndex: 'age', xtype: 'numbercolumn', format: '0', editor: { xtype: "numberfield", decimalPrecision: 0, selectOnFocus: true } }, { text: '電話', dataIndex: 'phone', editor: "textfield" } ], plugins: [ Ext.create('Ext.grid.plugin.CellEditing', { clicksToEdit: 1 }) ], listeners: { itemdblclick: function (me, record, item, index, e, eOpts) { //雙擊事件的操做 } }, bbar: { xtype: "pagingtoolbar", store: store, displayInfo: true } });
這個GridPanel的效果以下:ide
在這個GridPanel中,咱們能夠經過複選框勾選數據行,能夠編輯「年齡」和「電話」列,還能夠對數據進行客戶端排序。flex
Extjs GridPanel的列有多種類型,例如:文本列、數字列、日期列、選擇框列、操做列等。咱們能夠經過xtype來指定不一樣的列類型。url
下面是列的經常使用配置項:idea
控制Extjs GridPanel行選擇模型的兩個配置項是selType和selModel。默認狀況下,selType爲rowmodel,對應的Ext.selection.Model。這種選擇模型不會在grid中添加複選框,它經過點擊行進行選中,默認爲多選「MULTI」。spa
若是咱們要使用複選框來選擇行,咱們須要使用下面的配置:插件
selType: "checkboxmodel",
而後,咱們能夠經過selModel來配置selType:
selModel: { injectCheckbox: 0, mode: "SIMPLE", //"SINGLE"/"SIMPLE"/"MULTI" checkOnly: true //只能經過checkbox選擇 },
除了界面操做來選中行,咱們還能夠經過代碼來選中行:
//選擇行,並保持其餘行的選擇狀態 grid.getSelectionModel().select(records, true); //選擇全部 grid.getSelectionModel().selectAll(); //根據row index選擇 grid.getSelectionModel().selectRange(startRow, endRow, true)
獲取選中行,仍然須要經過SelectionModel來完成:
var records = grid.getSelectionModel().getSelection();
默認狀況下Extjs GridPanel是不顯示行號的,咱們須要手動添加行號列。
columns: [ { xtype:
"rownumberer", text: "序號"
, width:40 }, { text: '姓名', dataIndex: 'name' }, { text: '年齡', dataIndex: 'age', xtype: 'numbercolumn', format: '0', editor: { xtype: "numberfield", decimalPrecision: 0, selectOnFocus: true } }, { text: '電話', dataIndex: 'phone', editor: "textfield" } ],
咱們能夠設置行號的列頭和寬度。
Extjs GridPanel的異步加載數據是經過Store來實現的。咱們以前已經介紹過Extjs Store的各類代理方式,能夠參考我以前的文章:
異步加載一般採用ajax代理,例如咱們代碼中用到的:
//2.建立store var store = Ext.create("Ext.data.Store", { model: "MyApp.model.User", autoLoad: true, pageSize: 5, proxy: { type: "ajax", url: "GridHandler.ashx", reader: { root: "rows" } } });
服務器端返回的數據格式以下:
{ "rows": [ { "name": "Tom", "age": 12, "phone": "1233455" }, { "name": "Jerry", "age": 12, "phone": "1233455" }, { "name": "Sinbo", "age": 12, "phone": "1233455" }, { "name": "Jack", "age": 12, "phone": "1233455" }, { "name": "Johnson ", "age": 12, "phone": "1233455" } ], "total": 5 }
當GridPanel中數據量大的時候,咱們就須要使用分頁了。
分頁的實現由兩部來完成,首先是在Store中添加pageSize配置項,用來肯定每頁顯示多少行數據;而後須要爲GridPanel添加PagingToolbar。
1. Store添加pageSize配置項
var store = Ext.create("Ext.data.Store", { model: "MyApp.model.User", autoLoad: true, pageSize: 5, proxy: { type: "ajax", url: "GridHandler.ashx", reader: { root: "rows" } } });
在分頁參數加上以後,Extjs在執行ajax請求的時候會添加三個參數:
2. GridPanel添加PagingToolbar
bbar: { xtype: "pagingtoolbar", store: store, displayInfo: true }
在完成這兩項配置之後,GridPanel就可使用分頁了。
Extjs GridPanel能夠方便的實現列編輯。要實現這個功能須要兩步:
1. 添加GridPanel的編輯插件
plugins: [ Ext.create('Ext.grid.plugin.CellEditing', { clicksToEdit: 1 }) ],
2. 爲須要編輯的列指定編輯器
columns: [ { xtype: "rownumberer", text: "序號", width:40 }, { text: '姓名', dataIndex: 'name' }, { text: '年齡', dataIndex: 'age', xtype: 'numbercolumn', format: '0', editor: { xtype: "numberfield", decimalPrecision: 0, selectOnFocus: true } }, { text: '電話', dataIndex: 'phone', editor: "textfield" }
編輯器能夠是一個field的配置,也能夠是一個xtype。
對於編輯後的單元格,會在左上角出現一個紅色的標識,說明該數據是編輯過的,要想去掉這個紅色箭頭,須要調用record的commit()方法。
grid.on('edit', function (editor, e) { // commit the changes right after editing finished e.record.commit(); });
除了單元格編輯外,Extjs還支持行編輯功能,只須要將插件替換爲RowEditing便可,此處再也不進行演示。
在默認狀況下,Extjs GridPanel不容許進行選中單元格中的內容,因爲不能選中,咱們就不可能來複制單元格中的內容。若是要實現這種功能,咱們須要經過viewConfig來實現。
代碼以下:
viewConfig:{ stripeRows:true,//在表格中顯示斑馬線 enableTextSelection:true //能夠複製單元格文字 }
Extjs GridPanel的列,當咱們點擊列頭的時候,會出現一個菜單:
若是咱們要禁用這個菜單,能夠將每一個column定義屬性menuDisabled指定爲true,代碼以下:
{header: 'Idno', dataIndex: 'idno', width:150,menuDisabled:true}
本文的示例代碼適用於Extjs 4.x和Extjs 5.x,在Extjs 4.2.1 和Extjs 5.0.1中可用!