使用 Extjs 建立 List 表格,在 WebForm 的情況下,利用 GridView 和 ADO.NET 就可以很迅速地建立表格,如果再套用 bootstrap,那就很舒服了。
但是當你表格要自己設計,連資料庫給的資料 ( json 格式 ) 都必須要對好欄位自己擺放,假設今天一個 List 已經很辛苦的寫好了,但是隔天老闆或客戶又要改欄位位置,那一定會叫苦連天,這時,Extjs 強大功能就會體現出來了,只需要變動幾行程式碼就可以達到欄位調換的功能,甚至可以拖曳欄位給使用者更友善的介面。
1.
首先必須要先建立資料來源的模型 ( Model ),名稱定義為 'Model',以下程式碼是以 Employee 表產生的欄位:// 定義 data model 定義資料欄位 欄位型態 Ext.define('Model', { extend: 'Ext.data.Model', fields: [ { name: 'EmployeeID', type: 'string' }, { name: 'LastName', type: 'string' }, { name: 'FirstName', type: 'string' }, { name: 'Title', type: 'string' }, { name: 'TitleOfCourtesy', type: 'string' }, { name: 'BirthDate', type: 'date' }, { name: 'HireDate', type: 'date' }, { name: 'Address', type: 'string' }, { name: 'City', type: 'string' }, { name: 'Region', type: 'string' }, { name: 'PostalCode', type: 'string' }, { name: 'HomePhone', type: 'string' }, { name: 'Extension', type: 'int' }, { name: 'Notes', type: 'string'}, { name: 'ReportsTo', type: 'string' }, { name: 'PhotoPath', type: 'string' }, { name: 'Country', type: 'string' }, { name: 'Photo', type: 'auto', }, { name: 'mappingField', type: 'auto', mapping: 'EmployeeID' } // mapping 到 EmployeeID 即值 = EmployeeID [mapping Ex. mapping Name.FirstName 即取 Name 這個類別裡 First Name 的值] ], })
2.
接著讀取 API 的資料將資料解析成 'Model' 的格式,建立 Ext.data.JsonStore 塞到變數 store。var store = Ext.create('Ext.data.JsonStore', { storeId: 'store', model: 'Model', // 指定data model //fields: ['EmployeeID', 'LastName', 'FirstName', 'Title', 'TitleOfCourtesy', 'BirthDate', 'HireDate', 'Address', 'City', 'Region', 'PostalCode', 'Country', 'HomePhone', 'Extension', 'Notes', 'ReportsTo', 'PhotoPath', 'Photo'], proxy: { type: 'ajax', url: 'http://localhost:8090/api/Employee', reader: { type: 'json', } }, autoLoad: true, // 自動載入 listeners: { load: function (store, records, options) { } }, });
3.
設定欄位過濾器 ( 視所需 ),是針對欄位做字串搜尋的功能,若是日期格式就是日期期間搜尋。日期篩選:
字串篩選:
// 欄位過濾器 var filters = { ftype: 'filters', encode: false, local: true, filters: [{ type: 'boolean', dataIndex: 'visible' }] };
4.
設定 toolbar ( 視所需 ),如果有需要整批修改或整批刪除,這裡可以加入。//建立toolbar dockedItems: [Ext.create('Ext.toolbar.Toolbar', { dock: 'top', // 置頂 items: [ '->', // 靠右 { //建立button xtype: 'button', text: 'toolbarButton', handler: function () { // 按下後動作 } }, { xtype: 'button', text: 'toolbarButton2', handler: function () { // 按下後動作 } } ] })]
5.
設定讀取不到資料要顯示甚麼文字。emptyText: 'No Matching Records'
6.
最後,完整程式碼為:Ext.Loader.setConfig({ enabled: true }); Ext.Loader.setPath('Ext.ux', '/Scripts/ext/examples/ux'); Ext.require([ 'Ext.grid.*', 'Ext.data.*', 'Ext.panel.*', 'Ext.layout.container.Border', 'Ext.tab.*', 'Ext.window.*', 'Ext.tip.*', 'Ext.ux.grid.FiltersFeature', ]); Ext.onReady(function () { Ext.QuickTips.init(); //加這行 tip 才會顯示 Ext.define('Model', { extend: 'Ext.data.Model', fields: [ { name: 'EmployeeID', type: 'string' }, { name: 'LastName', type: 'string' }, { name: 'FirstName', type: 'string' }, { name: 'Title', type: 'string' }, { name: 'TitleOfCourtesy', type: 'string' }, { name: 'BirthDate', type: 'date' }, { name: 'HireDate', type: 'date' }, { name: 'Address', type: 'string' }, { name: 'City', type: 'string' }, { name: 'Region', type: 'string' }, { name: 'PostalCode', type: 'string' }, { name: 'HomePhone', type: 'string' }, { name: 'Extension', type: 'int' }, { name: 'Notes', type: 'string'}, { name: 'ReportsTo', type: 'string' }, { name: 'PhotoPath', type: 'string' }, { name: 'Country', type: 'string' }, { name: 'Photo', type: 'auto', }, { name: 'mappingField', type: 'auto', mapping: 'EmployeeID' }, ], }) var store = Ext.create('Ext.data.JsonStore', { storeId: 'store', model: 'Model', //fields: ['EmployeeID', 'LastName', 'FirstName', 'Title', 'TitleOfCourtesy', 'BirthDate', 'HireDate', 'Address', 'City', 'Region', 'PostalCode', 'Country', 'HomePhone', 'Extension', 'Notes', 'ReportsTo', 'PhotoPath', 'Photo'], proxy: { type: 'ajax', url: 'http://localhost:8090/api/Control', reader: { type: 'json', } }, autoLoad: true, listeners: { load: function (store, records, options) { } }, }); var filters = { // ftype: 'filters', encode: false, local: true, filters: [{ type: 'boolean', dataIndex: 'visible' }] }; var gridPanel = Ext.create('Ext.grid.Panel', { renderTo: Ext.getBody(), store: store, itemId: 'gridPanel', region: 'north', //height: 460, split: true, collapsible: true, features: [filters], columns: [ //flex 有width 寬為其值 剩下的撈會依比例 分剩下的欄寬 Ex. 5個欄位 flex 分別為 1 2 3 4 5 flex 為2 的就是 2/15 剩下的欄寬 { text: 'EmployeeID', width: 100, dataIndex: 'EmployeeID', sortable: true, filter: true }, //filter 可篩選 { text: 'LastName', flex: 1, dataIndex: 'LastName', sortable: true }, { text: 'FirstName', flex: 1, dataIndex: 'FirstName', sortable: true }, { text: 'Title', flex: 1, dataIndex: 'Title', sortable: true }, { text: 'TitleOfCourtesy', flex: 1, dataIndex: 'TitleOfCourtesy', sortable: true, filter: true }, { text: 'BirthDate', flex: 1, dataIndex: 'BirthDate', sortable: true, filter: true }, { text: 'HireDate', flex: 1, dataIndex: 'HireDate', sortable: true, filter: true, renderer: Ext.util.Format.dateRenderer('Y/m/d A g:i:s '), },// formate 時間格式 { text: 'Address', flex: 1, dataIndex: 'Address', sortable: true, filter: true }, { text: 'City', flex: 1, dataIndex: 'City', sortable: true, filter: true }, { text: 'Region', flex: 0.5, dataIndex: 'Region', sortable: true, filter: true }, { text: 'PostalCode', flex: 1, dataIndex: 'PostalCode', sortable: true, filter: true }, { text: 'Country', flex: 1, dataIndex: 'Country', sortable: true, filter: true, }, { text: 'HomePhone', flex: 1, dataIndex: 'HomePhone', sortable: true, filter: true }, { text: 'Extension', flex: 1, dataIndex: 'Extension', sortable: true, filter: true }, { text: 'mappingField', flex: 1, dataIndex: 'mappingField', sortable: true, filter: true } ], loadMask: true, dockedItems: [Ext.create('Ext.toolbar.Toolbar', { dock: 'top', items: [ '->', { xtype: 'button', text: 'toolbarButton', handler: function () { } }, { xtype: 'button', text: 'toolbarButton2', handler: function () { } } ] })], emptyText: 'No Matching Records', }); });
結果圖:
沒有留言 :
張貼留言