SlickGrid 基本方法篇

转自http://blog.csdn.net/besley/article/details/8894348

SlickGrid 基本方法篇

分类: Javascript MVC   3834人阅读  评论(2)  收藏  举报
SlickGrid javascript

前言:SlickGrid 是一个Javascript编写的数据控件,其采用数据虚拟显示的特性备受后来的Grid推崇,如ExtJS DataGrid,其架构设计优秀,UI交互功能非常丰富,插件化的可扩展功能开发非常值得Web开发人员学习,本文列出基本方法的使用,供开发人员参考;并在后文继续总结列出已经开发出的插件,以供开发人员参考。


0. SlickGrid 基本样式示例

功能包括:

1)首列复选框;

2)编辑器:文本编辑框,下拉框,复选框,日期控件,长文本编辑器,数字格式编辑器,YesNo编辑器等;

3)列排序,列字段值过滤,列冻结;

4)分页:客户端分页和服务端分页;

5)多字段组合查询;

6)各种列样式指定,行样式设定;

其它扩展功能依然可以通过插件完成。

SlickGrid 基本方法篇_第1张图片

1. Grid初始化及数据绑定 new、setItems、setSelectionModel

[javascript]  view plain copy
  1. var gridView;  
  2. var grid;  
  3. var data = [];  
  4. var columns = [  
  5.     { id: "id", name: "id", field: "id", behavior: "select" },  
  6.     { id: "code", name: "入库单编号", field: "code"},  
  7.     { id: "ctemp1", name: "明细款号", field: "ctemp1" }  
  8. ];  
  9. var options = {  
  10.     editable: true,  
  11.     enableCellNavigation: true,  
  12.     enableColumnReorder: true,  
  13.     asyncEditorLoading: true,  
  14.     forceFitColumns: false,  
  15.     topPanelHeight: 25  
  16. };  
  17. ajaxPost('/Stk/StkInm/StkInmSearch/' + id,  
  18. JSON.stringify(id),  
  19. function (result) {  
  20.         data = result;  
  21.         gridView = new Slick.Data.DataView({ inlineFilters: true });  
  22.         grid = new Slick.Grid("#GridSearch", data, columns, options);  
  23.         gridView.setItems(data, "id");  
  24.         grid.setSelectionModel(new Slick.RowSelectionModel());  
  25. }  



2. 隐藏列 setColumns
1) 代码设置隐藏:
[javascript]  view plain copy
  1. var visibleColumns = [];//定义一个数组存放显示的列       
  2. for (var i = 0; i < columns.length; i++) {  
  3.     if (i!=0)  
  4.        visibleColumns.push(Columns[i]);//将columns的列push进去  
  5. }  

2)设置grid的列

[javascript]  view plain copy
  1. grid.setColumns(visibleColumns);  

3)右键菜单设置隐藏:
[javascript]  view plain copy
  1. var columnpicker = new Slick.Controls.ColumnPicker(columnsSearch, gridSearch, options);  

4)当点击菜单选项时,在columnpicker控件中,有方法调用:

[javascript]  view plain copy
  1. grid.setColumns(visibleColumns);  

3. 数据分页 onDataPagedEvent
[javascript]  view plain copy
  1. //分页事件  
  2. var onDataPagedEvent = function (e, args) {  
  3.     var pageNum = args.pageNum;  
  4.     var pageSize = args.pageSize;  
  5.     loadGridPaged(pageNum, pageSize, $('#TB_Search').val());  
  6. };  
  7. //分页数据获取方法封装  
  8. function loadGridPaged(pageNum, pageSize,txt) {  
  9.     var pagetxt = {  
  10.         searchtxt: txt,  
  11.         pageNum: pageNum,  
  12.         pageSize: pageSize  
  13.     }  
  14.   
  15.   
  16.     ajaxPost('/Stk/StkInm/StkInmSearch/' + pagetxt,  
  17.                     JSON.stringify(pagetxt),  
  18.                 function (result) {  
  19.             data = result.t;  
  20.             var rowCount = result.s;  
  21.             var pageCount = Math.ceil(rowCount / pageSize);  
  22.   
  23.   
  24.                    var pageInfo = {};  
  25.             pageInfo.pageNum = pageNum;  
  26.             pageInfo.pageSize = pageSize;  
  27.                    pageInfo.totalRowsCount = rowCount;  
  28.             pageInfo.totalPagesCount = pageCount;  
  29.   
  30.   
  31.                    gridView = new Slick.Data.DataView({ inlineFilters: true });  
  32.             grid = new Slick.Grid("#GridSearch", Data, Columns, Options);  
  33.             gridView.setItems(data, "id");  
  34.             grid.setSelectionModel(new Slick.RowSelectionModel());  
  35.   
  36.   
  37.                 //注册分页控件  
  38.             var pager = new Slick.Controls.PagerSvr(gridView, grid, PageInfo, $("#pagergrid"));  
  39.               pager.onDataPaged.subscribe(onDataPagedEvent);  
  40.               });  
  41.     }  


4. gird单击、双击事件: onClick、onDblClick

    

[javascript]  view plain copy
  1. grid.onClick.subscribe(function (e, args) {  
  2.        //单击事件发生的处理逻辑  
  3.    });  
  4.     grid.onDblClick.subscribe(function (e, args) {  
  5.       //双击事件发生的处理逻辑  
  6.    });  

5. 编辑单元格,改变另外一个单元格
 
[javascript]  view plain copy
  1. //未用DataView编辑单元格数据  
  2.         gridProduct.onCellChange.subscribe(function (e, args) {  
  3.             gridProduct.invalidateRow(args.row);  
  4.             dsProduct[args.row]["Notes"] = dsProduct[args.row]["Notes"] + "new string added.";  
  5.             gridProduct.render();  
  6.         });  
  7.   
  8.   
  9.  //DataView编辑单元格数据  
  10.         gridProduct.onCellChange.subscribe(function (e, args) {  
  11.             var item = args.item;  
  12.             item.Notes = item.Notes += " new sring added.";  
  13.             changedItemsProduct.push(item);  
  14.             dataViewProduct.updateItem(item.ID, item);  
  15.             grid.render();  
  16.     }  

6. 行描色、单元格描色、字体描色 setCellCssStyles
[javascript]  view plain copy
  1. //默认单元格描色  
  2. var attachdColumns = [  
  3.     { id: "ID", name: "ID", field: "ID", behavior: "select", cssClass: "readonlycss",formatter: ztcolFormat },  
  4.     { id: "attid", name: "attid", field: "attid", cssClass: "readonlycss" },  
  5.     { id: "att_name", name: "文件名", field: "att_name" },  
  6.     { id: "att_path", name: "路径", field: "att_path" },  
  7.     { id: "txt", name: "主题", field: "txt"},  
  8.     { id: "att_remarks", name: "内容", field: "att_remarks" }  
  9. ];  
  10.                     var colarry = [];  
  11. function ztcolFormat(row, cell, value, columnDef, dataContext) {  
  12.     if (dataContext.txt != "") {  
  13.         colarry.push(row);  
  14.     }  
  15.     //须return,否则无数据显示  
  16.     return value;  
  17. }  
  18. for (var i = 0; i < colarry.length; i++) {  
  19.      hash[colarry[i]] = {};  
  20.      hash[colarry[i]]["attid"] = "changed2";  
  21. }  
  22.  //给第四行描色  
  23.  for (var i = 0; i < attachdColumns.length; i++) {  
  24.      hash[3][attachdColumns[i].id] = "changed";  
  25.  }  
  26.   
  27.   
  28.  gridattachd.setCellCssStyles("hightlight", hash);  


7. 行选定方法
[javascript]  view plain copy
  1. function getSelectedDataItem() {  
  2.     if (!selectionModel) {  
  3.         throw "Selection model is not set";  
  4.     }  
  5.     return getDataItem(selectedRows[0]);  
  6. }  
  7.   
  8.   
  9. function getSelectedDataItems() {  
  10.     if (!selectionModel) {  
  11.         throw "Selection model is not set";  
  12.     }  
  13.     var items = selectedRows.map(function (x) {  
  14.         return getDataItem(x);  
  15.     });  
  16.     return items;  
  17. }  
  18.   
  19.   
  20. 调用示例:  
  21. var row = grid.getSelectedDataItem();  
  22. 及  
  23. var rows = grid.getSelectedDataItems();  

8. 单元格值改变事件 onCellChange
[javascript]  view plain copy
  1. //单元格值改变事件  
  2. gridBom.onCellChange.subscribe(function (e, args) {  
  3.     var index = args.row;  
  4.     var item = gridViewBom.getItemByIdx(index);  
  5.     item.pyardcw = item.pyard * item.wear;  
  6.     //gridViewBom.updateItem(args.item.ID, item);  
  7.     gridBom.updateRow(args.row);  
  8.     if (editData.length > 0) {  
  9.         var live = false;  
  10.         for (var i = 0; i < editData.length; i++) {  
  11.             if (editData[i].ID == args.item.ID) {  
  12.                 editData[i] = item;  
  13.                 live = true;  
  14.             }  
  15.         }  
  16.         if (live == false) {  
  17.             editData.push(item);  
  18.         }  
  19.     }  
  20.     else { editData.push(item); }  
  21. });  

9. 选中行改变事件
[javascript]  view plain copy
  1. //选中行改变事件  
  2. gridBom.onSelectedRowsChanged.subscribe(function (e, args) {  
  3.     var item = gridViewBom.getItemByIdx(selectedRowIndex);  
  4.     //添加状态码下拉框  
  5.     var selectDom = "";  
  6.     ajaxPost('/WebFramework/Sampric/BindMtrStauts/' + item.mtrid,  
  7.         JSON.stringify(item.mtrid),  
  8.         function (result) {  
  9.             if (result != null) {  
  10.                 var aa = [];  
  11.                 aa = result;  
  12.                 for (var i = 0; i < aa.length; i++) {  
  13.                     var statusItem = result[i];  
  14.                     selectDom += " + statusItem.ID + "'>" + statusItem.Text + "";  
  15.                 }  
  16.                 selectDom += "";  
  17.                 args.grid.$selDropdownlistDatasource = $(selectDom);  
  18.             }  
  19.         });  
  20.     args.grid.onTextButtonClick = function (arg) {  
  21.         //e.stopPropagation();  
  22.         var strValue = 'hello world';  
  23.         alert("打开新窗口页面,包含要选取的数据列表!");  
  24.         arg.textContent = strValue;  
  25.     };  
  26. });  

10. 合并单元格(未完整版) groupFormatter
[javascript]  view plain copy
  1. //合并成本项目  
  2. var xm = "a";  
  3. function groupFormatter(row, cell, value, columnDef, dataContext) {  
  4.     if (dataContext.fsttxt == xm) {  
  5.          if (value != "")  
  6.             columnDef.cssClass = "noneLine";  
  7.         return "";  
  8.     }  
  9.     else {  
  10.         xm = dataContext.fsttxt;  
  11.         return value;  
  12.     }  
  13. }  

11. 新增行
[javascript]  view plain copy
  1. var pstItem = { id: "", stkid: "", stktxt: "", stkp: "", memo: "" };  
  2. //添加  
  3. function addPst() {  
  4.     if (stkid <= 0)  
  5.         return;  
  6.     pstItem.stkid = stkid;  
  7.     pstItem.stktxt = stkItm.txt;  
  8.     Datapst.push(pstItem);  
  9.     gridpst.updateRowCount();  
  10.     gridpst.render();  
  11. }  

12. 复制行

[javascript]  view plain copy
  1. //复制行  
  2. function copyRow(result, selectedRowIndex) {  
  3.     var item = gridViewBom.getItemByIdx(selectedRowIndex);  
  4.     //gridBom.invalidateRow(result.length);  
  5.     item.ID = "";  
  6.     result.push(item);  
  7.     gridBom.updateRowCount();  
  8.     gridBom.render();  
  9. }  


13. 删除行
[javascript]  view plain copy
  1. //删除  
  2. function delPst() {  
  3.     if (confirm("确定删除明细吗?")) {  
  4.         if (pstid == undefined || pstid == null || pstid == "" || pstid <= 0) {  
  5.         }  
  6.         else {  
  7.             ajaxPost('/Stk/StkMain/DelPst/' + pstid,  
  8.                 JSON.stringify(pstid),  
  9.                 function (result) {  
  10.                     alert("删除成功!");  
  11.                 });  
  12.         }  
  13.         datapst.splice(pstsIndex, 1);  
  14.   
  15.   
  16.         gridpst.invalidateRow(pstsIndex);  
  17.         gridpst.updateRowCount();  
  18.         gridpst.render();  
  19.     }  
  20. }  

14. Grid修改后离开提示保存
[javascript]  view plain copy
  1. //离开提示保存  
  2. function leaveSave() {  
  3.     if (editData.length!=0) {  
  4.         if (confirm("尚未保存明细,是否保存?")) {  
  5.             save();  
  6.             alert("保存成功!")  
  7.         }  
  8.         else {  
  9.             editData = [];  
  10.         }  
  11.     }  
  12. }  


15. grid样式保存
[javascript]  view plain copy
  1. //保存样式到cookie  
  2. function saveGridStyle() {  
  3.     newColumns = gridBom.getColumns();  
  4.     for (var i = 0; i < newColumns.length; i++) {  
  5.         if (newColumns[i].editor != undefined) {  
  6.             newColumns[i].editor = getDomStyle(newColumns[i].editor.toString());  
  7.         }  
  8.     }  
  9.     //BomColumns = newColumns;  
  10.     ajaxPost('/WebFramework/Sampric/SaveGridBomStyle/',  
  11.         JSON.stringify(newColumns),  
  12.         function (result) {  
  13.             if (result != null) {  
  14.                 //获取存在cookie的样式  
  15.                 //var gridStyle = JSON.parse(JSON.parse(result).gridBom);  
  16.                 alert("ok");  
  17.                 getBomStyle();  
  18.                 bindBom(searchItem.ID);  
  19.             }  
  20.         });  
  21. }  
  22. //取样式  
  23. function getBomStyle() {  
  24.     ajaxPost('/WebFramework/Sampric/GetBomStyle/',  
  25.         '',  
  26.         function (result) {  
  27.             if (result != false) {  
  28.                 //获取存在cookie的样式  
  29.                 var gridStyle = JSON.parse(JSON.parse(result).gridBom);  
  30.                 newColumns = gridStyle;  
  31.             }  
  32.         });  
  33. }  
  34. //清除cookie样式  
  35. function coverGrid() {  
  36.     ajaxPost('/WebFramework/Sampric/ClearGridStyle/',  
  37.     '',  
  38.     function (result) {  
  39.         if (result != null) {  
  40.             newColumns = [];  
  41.             alert("恢复成功!");  
  42.             getBomStyle();  
  43.             bindBom(searchItem.ID);  
  44.         }  
  45.     });  
  46. }  


16. 右键菜单栏 contextMenu
[javascript]  view plain copy
  1. //gridBom右键菜单  
  2. $("#gridBom").contextMenu('myMenu', {  
  3.     bindings: {  
  4.         'savestyle': saveGridStyle,  
  5.         'clearstyle': coverGrid  
  6.     }  
  7. });  

17. 默认选中第一行
[javascript]  view plain copy
  1. //默认选中第一行  
  2. var attachrows = [];  
  3. var attachitem;  
  4. if (attachData.length > 0) {  
  5.     attachrows.push([0]);  
  6.     gridattach.setSelectedRows(attachrows);  
  7.     attachitem = gridViewattach.getItemByIdx(0);  
  8.     //附件从表  
  9.     bindGridAttachd(attachitem.ID);  
  10. }  
  11. else  
  12.     $('#gridattachd').empty();  
  13.   
  14.   
  15. Ps:多行选择,界面多行合计,列拖动直接删除列(样式)  

18. 行是否可编辑、单元格是否可以编辑的判断 onBeforeEditCell
[javascript]  view plain copy
  1. //是否可编辑行的验证  
  2. gridProduct.onBeforeEditCell.subscribe(function (e, args) {  
  3.         //此处列出行属性,同样也可以获取列属性,从而定位单元格  
  4.     if (args.row === 4) {  
  5.         return false;  
  6.     }  
  7. });  

19. 列是否可以编辑
[javascript]  view plain copy
  1. var columnsProduct = [  
  2.  { id: "ID", name: "产品编号", field: "ID", fieldType: "number", width: 100, cssClass: "cell-title" },  
  3.  { id: "ProductName", name: "产品名称", field: "ProductName", fieldType: "string", width: 120, hasFilter: true, editor: Slick.Editors.TextButton },  
  4.  { id: "UnitPrice", name: "单价", field: "UnitPrice", fieldType: "number", hasFilter: true, editor: Slick.Editors.Text }  
  5. ];  
  6.   
  7.   
  8. gridProduct = new Slick.Grid("#myGridProduct", dataViewProduct, columnsProduct, optionsProduct);  


如果要使整列不可编辑,在定义Columns时,对该列不要设置Editor的属性,即该列处于不能编辑的状态;如果要使该列重新处于编辑状态,则更新列定义,添加该列的Editor属性。


20. 行的样式设定 getItemMetadata
为特定行指定样式,比如对满足某些条件的行,进行颜色字体的设置,用于突出显示,则使用getItemMetadata方法,返回自定义的行样式。


[javascript]  view plain copy
  1. .slick-row.redrowextra {   
  2.     color:red;   
  3.     font-size:18px;   
  4.     font-style: italic;   
  5.     font-weight: bold;   
  6. }   
  7.   
  8.   
  9. .slick-row.redrowreadonly {   
  10.     color:peru;   
  11.     font-size:18px;   
  12.     font-style: italic;   
  13.     font-weight: bold;   
  14. }  
  15.   
  16.   
  17. dataViewProduct.getItemMetadata = function (row) {  
  18.     if (row % 2 === 1) {  
  19.         return {  
  20.             'cssClasses''redrowextra'  
  21.         };  
  22.     } else {  
  23.         return {  
  24.             'cssClasses'' redrowreadonly'  
  25.         };  
  26.     }  
  27. }  


21 列样式设定 formatter
[javascript]  view plain copy
  1. //先根据列数值,定义列样式:  
  2. var numberFormatter = function (row, cell, value, columnDef, dataContext) {  
  3.     try {  
  4.         if (value < 100)  
  5.             return '' + value + '';  
  6.         else if (value >= 5000)  
  7.             return '' + value + '';  
  8.         else  
  9.             return '' + value + '';  
  10.     } catch (e) {  
  11.         return '';  
  12.     }  
  13. }  
  14.   
  15.   
  16. //然后在列定义数组中,指定formatter属性;下面的例子是为”UnitPrice”列指定数字格式的样式,根据数字范围进行数据的颜色标识,对于业务人员处理数字类型的操作时,比较有用。  
  17. var columnsProduct = [  
  18.    { id: "ID", name: "产品编号", field: "ID", fieldType: "number", width: 100, cssClass: "cell-title" },  
  19.    { id: "ProductName", name: "产品名称", field: "ProductName", fieldType: "string", width: 120, hasFilter: true, editor: Slick.Editors.TextButton },  
  20.    { id: "UnitPrice", name: "单价", field: "UnitPrice", fieldType: "number", hasFilter: true, editor: Slick.Editors.Text, formatter: numberFormatter }  
  21. ]  

SlickGrid 源代码网站:
https://github.com/mleibman/SlickGrid

你可能感兴趣的:(SlickGrid 基本方法篇)