ExtJS 教學 Grid 介紹與常用功能
===== Ext.grid.Panel =====
Grid 是在客戶端上顯示大量表格資料的好幫手!實際上就是專門用來顯示類似資料庫Table 的格式的UI 元件。- 讓大量的表格資料變得容易存取、甚至還提供排序和過濾功能。
- 由於 Grid 繼承自 Panel 類別,因此也可以設定上工具列 tbar 與下工具列 bbar 。
- xtype 為: gridpanel, grid
Grid 繼承自 Ext.panel.Panel類別 :
* Ext.panel.Panel
* Ext.panel.Table
* Ext.grid.Panel
一個完整的Grid 分為兩個部分:
- 一個顯示欄位標題的Columns。
- 一個儲存資料的Store 元件。
=== Columns 簡介===
- Columns 用來Grid 的定義表格欄位,是一個具有text 與 dataIndex 屬性的物件陣列。
- 利用text 屬性來決定Grid 的欄位名稱。
- 利用dataIndex 屬性來與Store 的資料相配對。
- Grid 的欄位顯示順序完全由此Columns 加入的順序決定。
=== Store 簡介===
- 用來存取表格的原始資料,可以是近端的二維陣列(Array ),或是遠端的JSON 或XML 資料。
- 利用fields 屬性來與columns 欄位相配對。
- reader 用來解析原始資料,如原始資料格式為json,reader的type 就填json 。
- type 可以是 array, json, xml
先來看看由json 提供近端資料的範例程式:
var store = Ext.create('Ext.data.Store', { fields: ['name', 'email', 'phone'], //利用fields 與Columns 的dataIndex 做配對。 data: {'items': [ //原始資料 {'name': 'Lisa', "email": "lisa@simpsons.com", "phone": "555-111-1224"}, {'name': 'Bart', "email": "bart@simpsons.com", "phone": "555-222-1234"}, {'name': 'Homer', "email": "home@simpsons.com", "phone": "555-222-1244"}, {'name': 'Marge', "email": "marge@simpsons.com", "phone": "555-222-1254"} ]}, proxy: { type: 'memory', reader: { type: 'json', //reader用來解析原始資料,如原始資料格式為json,reader 的type 就填json 。 #可以是 array, json, xml root: 'items' //告訴reader 要選擇data 中哪一個含有raw Data 的Array 的物件。 } } }); var columnModel = [ ////建立ColumnMode {text: '名稱', dataIndex: 'name'}, {text: '電子信箱', dataIndex: 'email', flex: 1}, {text: '電話', dataIndex: 'phone'} ]; Ext.create('Ext.grid.Panel', { // 新增Grid title: 'Grid 範例', store: store, //將預先寫好的store 填入grid columns: columnModel, //將預先寫好的columns 填入grid height: 200, width: 400, renderTo: Ext.getBody() });
===== 取得被選取的 row 資料 =====
var mygrid = Ext.create('Ext.grid.Panel', { // 新增Grid title: 'Grid 範例', store: store, /* 新增一個grid... */ var selectedRow = mygrid.getSelectionModel().getLastSelected().data; // Object, 取得被選取的那一列 row // selectedRow.name //取得被選取的那一列的 name 欄位值 // selectedRow.age //取得被選取的那一列的 age 欄位值 // selectedRow.email//取得被選取的那一列的 email欄位值
===== Grid 資料編輯器 =====
Ext.Grid 必須透過官方套件才可以編輯內容,可以在 plugins 屬性載入 Ext.grid.plugin.CellEditing 或 Ext.grid.plugin.RowEditing 便可對 Grid 資料進行編輯。Ext.create('Ext.data.Store', { storeId:'simpsonsStore', fields:['name', 'email', 'phone'], data:{'items':[ {"name":"Lisa", "email":"lisa@simpsons.com", "phone":"555-111-1224"}, {"name":"Bart", "email":"bart@simpsons.com", "phone":"555--222-1234"}, {"name":"Homer", "email":"home@simpsons.com", "phone":"555-222-1244"}, {"name":"Marge", "email":"marge@simpsons.com", "phone":"555-222-1254"} ]}, proxy: { type: 'memory', reader: { type: 'json', root: 'items' } } }); Ext.create('Ext.grid.Panel', { title: 'Simpsons', store: Ext.data.StoreManager.lookup('simpsonsStore'), columns: [ {header: 'Name', dataIndex: 'name', editor: 'textfield'}, //再每個欄位加入 editor: 'textfield' ,即可編輯欄位 {header: 'Email', dataIndex: 'email', flex:1, editor: { xtype: 'textfield', allowBlank: false //不允許空白 } }, {header: 'Phone', dataIndex: 'phone'} //不加入則不允許編輯 ], selType: 'cellmodel', plugins: [ Ext.create('Ext.grid.plugin.RowEditing', { // 加入官方 CellEditing 差件 clicksToEdit: 1 // 按一下進行編輯,預設為按兩下 }) ], height: 200, width: 400, renderTo: Ext.getBody() });
===== 新增一筆資料 =====
使用 store.insert() 方法添入一筆新資料,新資料的欄位必須與 store 的 Fields 一模一樣。function addNewRow() { // or Ext.getCmp('your_storeID').insert.... your_store.insert(0, { RECEIVABLES_LISTNUMBER: Ext.getCmp("ID_text").getValue(), RECEIVABLES_CATEGORY: null, RECEIVABLES_AMOUNT: null, LC_ID: null, CORRESPONDING_SUBJECT_ID: null, RECEIVABLES_ACCOUNT: null, RECEIVABLES_BANK: null, RECEIVABLES_DATE: null, BILL_CREDIT_NUMBER: null, EXPIRY_DATE: null, PREAGAINST_DATE: null, BILL_ACCOUNT: null, BILL_BANK: null, ANNOTATION: null }); rowEditing.startEdit(0, 0); }
===== 利用 renderer處理Cell內容 =====
在對每個 Column 做設定時,可以透過 renderer 來攔截資料,在 Store 載入後, renderer 可以在資料顯示於畫面之前對資料做處理,例如大小寫轉換,中英文轉換等。renderer: 'uppercase'
參數:
value : Object
The data value for the current cell
new Ext.grid.Panel({ id: 'grid_DetailGrid', flex: 4, margin: 20,
store: store_DetailGrid, selType: 'rowmodel', selModel: {mode: 'MULTI'}, columns: [ {header: ChangeLanguage("Receivables Category"), dataIndex: 'RECEIVABLES_CATEGORY', renderer: function (value) { return ChangeNumber(value); }, flex: 1}, // 加入 renderer 屬性,並使用自己事先寫好的 Function 對資料作處理。 {header: ChangeLanguage("Amount"), dataIndex: 'RECEIVABLES_AMOUNT', flex: 1}, {header: ChangeLanguage("L/C ID"), dataIndex: 'LC_ID', flex: 1}, ] }); function ChangeNumber(no) { no.trim().toString(); var item; switch (no) { case "0": item = '其他'; break; case "1": item = '現金'; break; case "2": item = '支票'; break; } return item; }
想了解有關 Renderer 的知識可前往參訪官方文件: Renderer
===== 刪除空的 Row =====
deleteEmptyRow(grid_DetailGrid); // parameter is your Grid function deleteEmptyRow(grid) { var store = grid.store; for (var i = 0; i < store.getCount(); i++) { var RECEIVABLES_CATEGORY = store.getAt(i).get("RECEIVABLES_CATEGORY"); // 取得 store Fields 內的"RECEIVABLES_CATEGORY"欄位 if (RECEIVABLES_CATEGORY === null) { store.remove(store.getAt(i)); } } }
想了解更多Ext.grid 的相關知識,可前往參訪官方文件: Ext.grid.Panel
留言
張貼留言