数据表格 DataGrid 组件、jqGrid 文档

数据表格是一个必不可少的元素,在选择这个选型的时候尝试了很多开源组件,最终选择jqGrid,只是因为它接近经典思维,用着还算顺手,最主要的是遇见什么问题都可以自行解决和修复问题,有人说jqGrid不好看,这没关系这完全而已自行编写CSS改造它。支持:分页,排序,多表头,分组,子表,冻结,小计,合计,编辑行,树表表格等;

更多资料:jqGrid 官方演示实例

最简单的一个例子

  1. <% layout(... libs: ['dataGrid'] ...}){ %>
  2. <#form:form id="searchForm" model="${config}" action="${ctx}/sys/config/listData" method="post" class="form-inline "
  3. data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
  4. 参数名称:<#form:input path="configName" maxlength="100" class="form-control" />
  5. 参数键名:<#form:input path="configKey_like" maxlength="100" class="form-control" />
  6. <button type="submit" class="btn btn-primary btn-sm">查询</button>
  7. <button type="reset" class="btn btn-default btn-sm">重置</button>
  8. </#form:form>
  9. <table id="dataGrid"></table>
  10. <div id="dataGridPage"></div>

JS:

  1. // 初始化DataGrid对象
  2. $('#dataGrid').dataGrid({
  3. // 查询数据表单
  4. searchForm: $('#searchForm'),
  5. // 设置数据表格列
  6. columnModel: [
  7. {header:'参数名称', name:'configName', index:'a.config_name', width:200, formatter: function(val, obj, row, act){
  8. return '<a href="${ctx}/sys/config/form?id='+row.id+'" class="btnList" data-title="编辑参数">'+val+'</a>';
  9. }},
  10. {header:'参数键名', name:'configKey', index:'a.config_key', width:200},
  11. {header:'参数键值', name:'configValue', sortable:false, width:260, classes:"nowrap"},
  12. {header:'操作', name:'actions', width:100, sortable:false, title:false, formatter: function(val, obj, row, act){
  13. var actions = [];
  14. <% if(hasPermi('sys:config:edit')){ %>
  15. actions.push('<a href="${ctx}/sys/config/form?id='+row.id+'" class="btnList" title="编辑参数"><i class="fa fa-pencil"></i></a>&nbsp;');
  16. <% } %>
  17. <% if(hasPermi('sys:config:delete')){ %>
  18. actions.push('<a href="${ctx}/sys/config/delete?id='+row.id+'" class="btnList" title="删除参数" data-confirm="确认要删除该参数吗?"><i class="fa fa-trash-o"></i></a>&nbsp;');
  19. <% } %>
  20. return actions.join('');
  21. }}
  22. ],
  23. // 加载成功后执行事件
  24. ajaxSuccess: function(data){
  25. }
  26. });

是不是比你使用foreach方便的多,封装后名字叫dataGrid,这只是展示了冰山一角,它支持所有jqGrid参数,即简化了代码编写,又不失功能

常用全局选项

  1. options = $.extend({
  2. // 数据表格参数
  3. url: searchForm.attr('action'),
  4. postData: searchForm.serializeArray(),
  5. mtype: "POST", datatype: "json",
  6. editurl: 'clientArray', // 单行编辑的时候使用本地数组形式
  7. rowNum: -1, // 显示行数,-1为显示全部
  8. rownumWidth: 30, // 序号列宽
  9. multiselectWidth: 20, // 复选框的宽度
  10. // multiboxonly: true, // 单击复选框时再多选
  11. altRows: true, // 斑马线样式,交替行altclass
  12. // 设置自定义列模型参数(columnModel包含colNames和colModel官方自带属性)
  13. columnModel: [], colNames: [], colModel: [],
  14. // 设置数据表格扩展参数
  15. dataId: 'id', // 指定数据主键,当主键名称不是id的时候设置
  16. lazyLoad: false, // 是否懒加载Grid数据,默认初始列表后不及时加载数据,(仅对url远程请求数据有效),当调用 dataGrid.refresh()时再进行加载。
  17. shrinkToFit: true, // 是否按百分比自动调整列宽,当列比较多时,开启水平滚动,可设置为false
  18. showRownum: true, // 是否显示行号
  19. showCheckbox: false, // 是否显示复选框
  20. sortableColumn: true, // 列表是否允许排序(设置为false后,整个列表不允许排序)
  21. multiSort: false, // 是否支持多列排序,给列指定 firstsortorder 可设定初次排序方式
  22. emptyDataHint: false, // 表格内没有数据的时候是否提示 “无数据显示” v4.1.7
  23. emptyDataHintContent: '<center>'+$.jgrid.defaults.emptyrecords+'</center>', // 没有数据的提示内容
  24. // 表格大小设置参数,autoGridHeight 和 autoGridWidth 可以是个函数,函数的返回值就是该表格的高度或宽度。
  25. autoGridHeight: true, // 自动表格高度(设置为false后,不自动调整表格高度)为函数时返回'100%',则自动高度。
  26. autoGridHeightFix: 0, // 自动表格高度宽度(自动调整高度时修正的高度值)
  27. autoGridWidth: true, // 自动表格宽度(设置为false后,不自动调整表格宽度)
  28. autoGridWidthFix: 0, // 自动表格修复宽度(自动调整宽度时修正的宽度值)
  29. // 窗体按钮绑定(不使用默认按钮或按钮ID不同时设置)
  30. btnSearch: $("#btnSearch"), // 查询按钮
  31. btnRefreshTree: $("#btnRefreshTree"), // 刷新树按钮
  32. btnExpandTreeNode: $("#btnExpandTreeNode"), // 展开树节点按钮
  33. btnCollapseTreeNode: $("#btnCollapseTreeNode"), // 折叠树节点按钮
  34. // 编辑表格参数
  35. editGrid: false, // 是否是编辑表格
  36. editGridInitRowNum: 1, // 编辑表格的初始化新增行数
  37. editGridInitAllRowEdit: true, // 是否初始化就编辑所有行
  38. editGridAddRowBtn: $("#"+dataGridId+"AddRowBtn"), // 子表增行按钮
  39. editGridAddRowBtnToHeader: false, // 子表增行按钮是否显示到表头上 v4.1.7
  40. editGridAddRowInitData: {}, // 新增行的时候初始化的数据(支持函数或对象)
  41. // 编辑表格的提交数据参数
  42. editGridInputForm: dataGrid.parents('form'), // 提交表单的ID(当前grid所在表单)
  43. editGridInputFormListName: '', // 提交的数据列表名,例如:testDataChildList
  44. editGridInputFormListAttrs: '', // 提交数据列表的属性字段,例如:id,status,name,remarks
  45. // 树结构表格参数
  46. treeGrid: false, // 启用树结构表格
  47. treeGridModel: 'adjacency', // 启用简单结构模式
  48. treeColumn: null, // 需要展开的列(默认第一列)
  49. ExpandColClick: true, // 隐含参数,请不要设置,单击列可展开
  50. ExpandColumn: options.treeColumn, // 隐含参数,请不要设置,需要展开的列
  51. defaultExpandLevel: 0, // 默认展开的层次
  52. initExpandLevel: options.defaultExpandLevel,// 保存初始化是设置的展开层次
  53. expandNodeClearPostData: false, // 展开节点清理请求参数数据,用来清理查询表单的参数
  54. // 分页相关字段(设置分页参数input对象)
  55. inputPageNo: $("#pageNo", searchForm), // 当前页码字段
  56. inputPageSize: $("#pageSize", searchForm), // 页面大小字段
  57. inputOrderBy: $("#orderBy", searchForm), // 排序字段
  58. // 设置多级表头
  59. groupHeaders: {
  60. twoLevel:[
  61. {startColumnName: 'postCode', numberOfColumns: 2, titleText: '二级表头'},
  62. {startColumnName: 'remarks', numberOfColumns:2, titleText:'二级表头2'}
  63. ],
  64. threeLevel:[
  65. {startColumnName: 'postCode', numberOfColumns:4, titleText:'三级表头'}
  66. ]
  67. },
  68. frozenCols: true, // 冻结列,锁定列,在 colModel 指定 frozen: true
  69. showFooter: true, // 是否显示底部合计行
  70. }, options);

列定义模型

配置项类型描述默认值
alignstring定义单元格中内容对齐方式,可用值: left, center, right.left
cellattrfunction这个方法在创建单元格内容的时候给单元格添加附加到属性。所有可用的单元格属性或者style属性中可用的值都可以使用,这个方法需要返回字符串。传递进入这个配置方法的参数如下:rowId - 单元格所属行id;val - 显示在单元格中的值;rawObject -原始的数据行对象。如果jqGrid配置中datatype为json,则为array对象。datatype为xml时则为xml node节点;cm - 所有colModel中配置的属于此列的属性;rdata - the data row which will be inserted in the row. 参数为键值对对象数组,name为colModel定义的namenull
classesstring给单元格添加附加样式。如果有多个样式需要添加,样式用空格隔开。例如:classes:’class1 class2’ 将会给此列单元格设置class1和class2样式。在css中有一个预定义的样式ui-ellipsis允许附加到特定的行empty string
datefmtstringsorttype配置为date(datetype被设置为local)或者editrules 配置为{date:true} 字段时,定义日期的显示格式。“/”,“-”,“.”可用于的时间分隔符号。可用的时间格式如下y,Y,yyyy :对应4位数字的年份YY, yy :对应2位数字的年份m,mm :对应月份d,dd :对应日期ISO Date (Y-m-d)
defvalstring作为搜索字段的默认值。只用于自定义搜索时的初始值。empty
editableboolean定义字段是否可以编辑。用于单元格,行编辑,和表单编辑。false
editoptionsarray依据edittype提供允许的值列表。empty array
editrulesarray给可编辑子都设置附加的规则。empty array
edittypestring给行,表单编辑配置字段编辑类型。可能的值: text, textarea, select, checkbox, password, button, image and file。text
firstsortorderstring设置为asc或者desc时,初始化时列将会按照这个进行排序。 随后排序将会轮流切换。null
fixedboolean即使jqGrid的shrinkToFit配置为ture时,当此配置为true,也不允许重新计算列的宽度。如果shrinkToFit为true,当jqGrid容器宽度变化后调用setGridWidth 方法也不会修改此列宽度。false
formoptionsarray定义表单编辑时的配置empty
formatoptionsarray重写默认配置语言文件中的配置项。none
formattermixed默认类型(string)或者客户自定义函数控制此字段的显示格式。none
frozenboolean设置为ture,此列将为冻结列,不允许拖拽滚动条改变位置。false
hidedlgboolean设置为true此列将不会出现在模式对话框中,用户可以选择此列的显示或者隐藏。false
hiddenboolean定义是否隐藏此列在初始化时。false
indexstring通过sidx参数设置排序时的索引名。empty string
jsonmapstring定义此列数据键和json数据源中的映射关系 。none
keyboolean如果从服务器获取的数据部包含id,可以通过此配置指定唯一id列。只有一列能指定此属性,如果多列配置了这个属性,第一个配置的生效,后续会被忽略。false
namestring设置此列的唯一名称。name是必须的。jqGrid配置的事件名称和属性名称,保留字不能作为此配置项的值,包括subgrid,cb和rn。Required
resizableboolean定义此列是否允许调整宽度true
searchboolean当配置了查询模块后,是否允许将此列作为查询条件. Search Configurationtrue
searchoptionsarray定义查询选项 Search Configurationempty
sortableboolean定义是否允许点击列表头进行排序true
sorttypemixed当datatype为local时有效。定义适当的排序类型。可用值;int/integer :按照整数排序;float/number/currency:按照数字排序date :日期排序;text :文本排序;function :按照自定义函数来排序。自定义函数接受此列排序的值,需要返回一个值。【原文: To this function we pass the value to be sorted and it should return a value too.】应该和javascript数组排序使用函数作为参数排序差不多,return-1/0/1text
stypestring定义查询对象的类型。 See Search Configurationtext
surlstring Custom Searching 中有效 和edittype为 ‘select’ 时这个配置从哪个动态页地址获取已经生成好的select html结构。empty string
templateobject设置colModel有效属性。当你希望覆盖列模式默认值时配置这个比较有用。 See cmTemplate in grid optionsnull
titleboolean如果设置为false,当鼠标移动到单元格上时不显示title提示信息。true
widthnumber设置初始化列宽,单位px。注意不能设置为百分比150
xmlmapstring定义此列和xml文件中的xml节点映射。none
unformatfunction返回单元格的原始值(在排序时也会调用unformat,在排序过程中返回值用于比较)null

上表内容来自网络(欢迎猿友纠错和完善,联系交流群群主)

常用事件

  1. options = $.extend({
  2. // 选择行后调用(id:行id,isSelect:是否是选中,event:事件)
  3. onSelectRow: function(id, isSelect, event) {
  4. },
  5. // 单击列表表头上的全选按钮时调用(ids:选中的id数组,isSelect:是否选中)
  6. onSelectAll: function(ids, isSelect){
  7. },
  8. // 双击表格行时调用(id:双击的行号,rownum:双击的行位置,column:双击的列)
  9. ondblClickRow: function(id, rownum, colnum, event){
  10. },
  11. // 展开节点事件
  12. onExpandNode: function(data){
  13. },
  14. // 折叠节点事件
  15. onCollapseNode: function(data){
  16. },
  17. // 数据加载前执行方法
  18. ajaxLoad: function(data){
  19. },
  20. // 数据加载成功后执行方法
  21. ajaxSuccess: function(data){
  22. },
  23. // 数据加载失败后执行方法
  24. ajaxError: function(data){
  25. },
  26. // 表格初始化完成后执行
  27. complete: function(){
  28. }
  29. }, options);

常用方法

调用示例

  1. // 该调用方式,支持调用 jqGrid 原生方法,与 $('#jqgrid').jqGrid('方法名') 相同
  2. $('#列表对象id').dataGrid('方法名', '参数1', '参数2', '参数3', '参数4', '参数5...等等');

设置参数

  1. // params:设置参数值,如:{url: '/sys/user/listData'}
  2. // overwrite:是否重写,如果设置参数为数组,则直接替换,不进行深度拷贝,原理如下:
  3. // if(overwrite === true) {
  4. // var params = $.extend({}, this.p, newParams);
  5. // this.p = params;
  6. // } else {
  7. // $.extend(true,this.p,newParams);
  8. // }
  9. $('#dataGrid').dataGrid('setParam', params, overwrite);
  10. // 举例:datatype为local时,则更新数据方法为:
  11. $('#roleGrid').dataGrid('setParam', {data:[{},{},{}]}, true);
  12. $('#roleGrid').dataGrid('refresh');

获取参数

  1. $('#dataGrid').dataGrid('getParam', paramName);

获取所有数据ID

  1. $('#dataGrid').dataGrid('getDataIDs');

获取某一行数据

  1. $('#dataGrid').dataGrid('getRowData', rowId);

获取全部行数据

  1. $('#dataGrid').dataGrid('getRowData');

获取选择行ID

  1. $('#dataGrid').dataGrid('getSelectRow');

获取选择行数组ID

  1. $('#dataGrid').dataGrid('getSelectRows');

设置选择行

  1. // isCancel: 是否是取消选中
  2. $('#dataGrid').dataGrid('setSelectRow', id, isCancel);

刷新表格(带分页)

  1. $('#dataGrid').dataGrid('refresh', pageNo, pageSize);

只刷新表格(重新载入)

  1. $('#dataGrid').dataGrid('reloadGrid');

删除当前行(普通列表用)

  1. $('#dataGrid').dataGrid('delRowData', id);

删除树节点(树结构用)

  1. $('#dataGrid').dataGrid('delTreeNode', id);

展开树节点

  1. // level:一次展开的层次(数值)
  2. $('#dataGrid').dataGrid('expandTreeNode', level);

折叠树节点

  1. $('#dataGrid').dataGrid('collapseTreeNode');

获取孩子节点

  1. $('#dataGrid').dataGrid("getNodeChildren", rowId);

刷新树表格

  1. // expandLevel: 展开的层级, parentCode:跟节点编号(只显示哪一级)
  2. $('#dataGrid').dataGrid('refreshTree', expandLevel, parentCode);

刷新树的子节点

  1. // rowid 行号
  2. // currentRowid 当前节点id,然后再重新加载新的父节点
  3. $('#dataGrid').dataGrid('refreshTreeChildren', rowid, currentRowid);

显示隐藏列

  1. $('#dataGrid').dataGrid('hideCol', '列名'); //隐藏列
  2. $('#dataGrid').dataGrid('showCol', '列名'); //显示列

合并单元格

1、合并相同数据行

在加载完成数据之后调用 mergeCell 方法:

  1. ajaxSuccess: function(data){
  2. // 第二个参数指定,合并的单元格列名(多个用逗号分隔,如:'company.companyNameSimple,office.officeName')
  3. $('#dataGrid').dataGrid('mergeCell', 'company.companyNameSimple,office.officeName');
  4. }

2、合并指定数据列:

根据加载的数据设置单元格属性:

  1. columnModel: [{
  2. name:'a', index:'a', width:50,
  3. cellattr: function(rowId, tv, rawObject, cm, rdata) {
  4. if (rowId == '123') { return ' colspan=2' }
  5. }
  6. },{
  7. name:'b', index:'b', width:50,
  8. cellattr: function(rowId, tv, rawObject, cm, rdata) {
  9. if (rowId == '123') { return ' style="display:none;"' }
  10. }
  11. }]

更新列表字段名字

  1. $('#dataGrid').dataGrid('updateListFieldName', listName, fieldNames);
  • 用于:提交子表前,更新列表字段名字,以方便后台接受
  • 参数:listName:后台接受实体中的 list 属性名
  • 参数:fieldNames:list 对象里的属性,多个用逗号分隔,如:’id,name,remarks’
  • 目的:将对应字段名字转换为 listName[index].fieldName 假设目前 grid 中有 3 条数据,调用如下方法:
  1. $('#dataGrid').dataGrid('updateListFieldName', 'testDataChildList', 'id,name,remarks');

调用前的 input name 参数:

  1. 1、<input name="id" value=""/>、<input name="name" value=""/>、<input name="remarks" value=""/>
  2. 2、<input name="id" value=""/>、<input name="name" value=""/>、<input name="remarks" value=""/>
  3. 3、<input name="id" value=""/>、<input name="name" value=""/>、<input name="remarks" value=""/>

调用后的 input name 参数:

  1. 1、<input name="testDataChildList[0].id" value=""/>、
  2. <input name="testDataChildList[0].name" value=""/>、
  3. <input name="testDataChildList[0].remarks" value=""/>
  4. 2、<input name="testDataChildList[1].id" value=""/>、
  5. <input name="testDataChildList[1].name" value=""/>、
  6. <input name="testDataChildList[1].remarks" value=""/>
  7. 3、<input name="testDataChildList[2].id" value=""/>、
  8. <input name="testDataChildList[2].name" value=""/>、
  9. <input name="testDataChildList[2].remarks" value=""/>

表格合计行

1、设置 options 选项如下:

  1. showFooter: true, // 是否显示底部合计行

2、合计行数据来源有两种方式

a) 第一种是: 后台添加如下代码

  1. page.addOtherData("user.userName", "<em>合计:&nbsp;</em>");
  2. page.addOtherData("sex", "<em>100 &nbsp;</em>");
  3. page.addOtherData("remarks", "<em>¥1000 &nbsp;</em>");

返回的数据格式如下:

  1. {"pageNo":1,
  2. "pageSize":30,
  3. "list":[ 返回结果集数据... ],
  4. "otherData":{ // 此属性为合计行数据集(列名对应合计行数据)
  5. "user.userName":"<em>合计:&nbsp;</em>"}
  6. "sex":"<em>100 &nbsp;</em>"}
  7. "remarks":"<em>¥1000 &nbsp;</em>"
  8. }

b) 第二种是:请求完成之后通过js设置,举例如下:

  1. ajaxSuccess: function(data){ // 加载成功后执行方法
  2. // 设置底部合计行数据(设置合计行)
  3. $('#dataGrid').dataGrid("footerData", "set", {
  4. 'user.userName' : '<em>合计:&nbsp;</em>',
  5. 'sex': '<em>100 &nbsp;</em>',
  6. 'remarks': '<em>¥1000 &nbsp;</em>'
  7. }, false);
  8. }

列表列格式化设置

  1. // 金额、货币、数量、千分位显示
  2. {header:'金额', name:'price', formatter:'integer', formatoptions:{thousandsSeparator:',', defaulValue:''}},
  3. {header:'货币', name:'price', formatter:'currency', formatoptions:{thousandsSeparator:',', decimalSeparator:'.', decimalPlaces:2, defaulValue:'', prefix:'¥'}},
  4. {header:'数量', name:'amount', formatter:'number', formatoptions:{thousandsSeparator:',', decimalPlaces:3, defaulValue:''}},
  5. // 日期类型格式化(原格式:yyyy-MM-dd HH:mm:ss 转换为:yyyy-MM-dd HH:mm)
  6. {header:'更新时间', name:'updateDate', formatter:"date", formatoptions:{srcformat:'Y-m-d H:i:s', newformat:'Y-m-d H:i'}},

formatter:主要是设置格式化类型(integer、email等以及函数来支持自定义类型)

formatoptions:用来设置对应 formatter 的参数,jqGrid 中预定义了常见的格式及其 options 如下:

  • integer
    • thousandsSeparator: //千分位分隔符,
    • defaulValue
  • number
    • decimalSeparator, //小数分隔符,如”.”
    • thousandsSeparator, //千分位分隔符,如”,”
    • decimalPlaces, //小数保留位数
    • defaulValue
  • currency
    • decimalSeparator, //小数分隔符,如”.”
    • thousandsSeparator, //千分位分隔符,如”,”
    • decimalPlaces, //小数保留位数
    • defaulValue,
    • prefix //前缀,如加上”$”
    • suffix//后缀
  • date
    • srcformat, //source的本来格式
    • newformat //新格式
  • email
    • 没有参数,会在该cell是email加上: mailto:name@domain.com
  • showlink
    • baseLinkUrl, //在当前cell中加入link的url,如”jq/query.action”
    • showAction, //在baseLinkUrl后加入&action=actionName
    • addParam, //在baseLinkUrl后加入额外的参数,如”&name=aaaa”
    • target,
    • idName //默认会在baseLinkUrl后加入,如”.action?id=1”。改如果设置idName=”name”,那么”.action?name=1”。其中取值为当前rowid
  • checkbox
    • disabled //true/false 默认为true此时的checkbox不能编辑,如当前cell的值是1、0会将1选中
  • select
    • 设置下拉框,没有参数,需要和colModel里的editoptions配合使用

使用本地数据渲染

1、关键属性:

  1. data: [{k:'v1'},{k:'v2'}], // 本地数据(JSON格式)
  2. datatype: "local", // 设置数据类型为,local(本地数据)
  3. rowNum: 1000 // 设置最大显示行数(如果不设置,默认为1000)

2、演示例子:

  1. // 用户编辑的选择角色示例
  2. $("#roleGrid").dataGrid({
  3. data: ${toJson(roleList)},
  4. datatype: "local",
  5. columnModel: [
  6. {header:'角色名称', name:'roleName', sortable:false, width:100},
  7. {header:'角色编码', name:'roleCode', sortable:false, width:100}
  8. ],
  9. showCheckbox: true, // 显示复选框
  10. autoGridHeight: function(){
  11. return 'auto'; // 高度为自动高度
  12. },
  13. autoGridWidth: function(){
  14. return $('#inputForm .tab-content').width(); // 相对宽度
  15. }
  16. });
  17. // 复选框,选择行相应行
  18. var ids = "${user.roleCodes}".split(",");
  19. for(var i=0; i<ids.length; i++) {
  20. $("#roleGrid").dataGrid('setSelectRow', ids[i]);
  21. }
  22. //获取选中角色ID字符串
  23. $("#roleGrid").dataGrid('getSelectRows').join(',');

动态数据、动态列模型

  1. // 动态追加数据
  2. var data = [];
  3. data.push({'roleName':'普通员工','roleCode'});
  4. data.push({'roleName':'普通员工','roleCode'});
  5. // 动态生成列模型
  6. var columnModel = [];
  7. columnModel.push({header:'角色名称', name:'roleName', sortable:false, width:100});
  8. columnModel.push({header:'角色编码', name:'roleCode', sortable:false, width:100});
  9. // 生成表格
  10. $("#roleGrid").dataGrid({
  11. data: data, // 应用动态生成的数据
  12. datatype: "local",
  13. columnModel: columnModel, // 应用动态生成的列模型
  14. showCheckbox: false
  15. });

主子表的其它实现方式

  • 初始化表单的时候,子表为非编辑状态
  • 点击新增行,新增的行为编辑状态
  • 单击当前行的编辑按钮,当前行为编辑状态
  • 支持新增和编辑状态下的删除行操作
  1. //初始化测试数据子表DataGrid对象
  2. $("#testDataChildDataGrid").dataGrid({
  3. data: ${toJson(testData.testDataChildList)},
  4. datatype: "local", // 设置本地数据
  5. autoGridHeight: function(){return 'auto'}, // 设置自动高度
  6. // 设置数据表格列
  7. columnModel: [
  8. {header:'关键字段', name:'id', hidden:false, formatter: function(val, obj, row, act){
  9. var html = [];
  10. html.push('<input type="text" id="'+row.id+'_id" name="id" value="'+(row.id||'')+'">');
  11. html.push('<input type="text" id="'+row.id+'_status" name="status" value="'
  12. +(row.status||Global.STATUS_NORMAL)+'">');
  13. return html.join('');
  14. }},
  15. {header:'${text("文本")}', name:'testInput', width:150,
  16. editable:true, edittype:'text', editoptions:{'maxlength':'200', 'class':'form-control'}},
  17. {header:'${text("下拉框")}', name:'testSelect', width:100,
  18. formatter: function(val, obj, row, act){
  19. return js.getDictLabel(${@DictUtils.getDictListJson('sys_menu_type')},
  20. val, '${text("未知")}', true);
  21. },
  22. unformat: function(val, obj, cell){
  23. return val;
  24. },
  25. editable:true, edittype:'select', editoptions:{'class':'form-control',
  26. items: $.merge([{dictLabel:'&nbsp;',dictValue:''}],
  27. ${@DictUtils.getDictListJson('sys_menu_type')}),
  28. itemLabel: 'dictLabel', itemValue: 'dictValue', dataInit: function(element){
  29. $(element).select2().on("change",function(){$(this).resetValid()});
  30. }
  31. }
  32. },
  33. {header:'${text("机构选择")}', name:'testOffice', width:150,
  34. formatter: function(val, obj, row, act){
  35. return js.val(row, 'testOffice.officeName');
  36. },
  37. unformat: function(val, obj, cell){
  38. return js.val(obj.colModel.data[obj.rowId], 'officeCode')
  39. + '|' + js.val(obj.colModel.data[obj.rowId], 'officeName');
  40. },
  41. editable: true, edittype: "custom", editoptions: {
  42. custom_element: function(val, editOptions) {
  43. return js.template('treeselectTpl', {
  44. id: 'office_'+editOptions.id, title: '机构选择',
  45. name: 'testOffice.officeCode', value: val.split('|')[0],
  46. labelName: 'testOffice.officeName', labelValue: val.split('|')[1],
  47. url: '${ctx}/sys/office/treeData?officeTypes=1,2', cssClass: ''
  48. });
  49. }
  50. }
  51. },
  52. {header:'${text("操作")}', name:'actions', width:80, sortable:false, fixed:true, formatter: function(val, obj, row, act){
  53. var actions = [];
  54. // 编辑行按钮,点击后,改变当前行为编辑状态
  55. actions.push('<a href="#" onclick="$(\'#testDataChildDataGrid\').dataGrid(\'editRow\',\''+obj.rowId+'\',{keys:true,focusField:true});return false;"><i class="fa fa-pencil"></i></a>&nbsp;');
  56. if (val == 'new'){
  57. // 点击新增行出现的删除按钮,从未保存到数据库过,直接删除即可
  58. actions.push('<a href="#" onclick="js.confirm(\'${text("你确认要删除这条数据吗?")}\', function(){$(\'#testDataChildDataGrid\').dataGrid(\'delRowData\',\''+obj.rowId+'\')});return false;"><i class="fa fa-trash-o"></i></a>&nbsp;');
  59. }else{
  60. // 初始化表单,回显的数据的删除按钮,隐藏行,并标记行为删除状态,点击表单保存后才真正进行删除
  61. actions.push('<a href="#" onclick="js.confirm(\'${text("你确认要删除这条数据吗?")}\', function(){$(\'#testDataChildDataGrid\').dataGrid(\'setRowData\',\''+obj.rowId+'\',null,{display:\'none\'});$(\'#'+obj.rowId+'_status\').val(\''+Global.STATUS_DELETE+'\');});return false;"><i class="fa fa-trash-o"></i></a>&nbsp;');
  62. }
  63. return actions.join('');
  64. }, editoptions: {defaultValue: 'new'}}
  65. ],
  66. // 编辑表格参数
  67. editGrid: true, // 是否是编辑表格
  68. editGridInitRowNum: 1, // 编辑表格的初始化新增行数
  69. editGridInitAllRowEdit: false, // 是否初始化就编辑所有行(*** 重点 ***)
  70. editGridAddRowBtn: $('#testDataChildDataGridAddRowBtn'), // 子表增行按钮
  71. editGridAddRowInitData: {id: '', status: Global.STATUS_NORMAL}, // 新增行的时候初始化的数据
  72. // 编辑表格的提交数据参数
  73. editGridInputFormListName: 'testDataChildList', // 提交的数据列表名
  74. editGridInputFormListAttrs: 'status,id,testInput,testOffice.officeCode,', // 提交数据列表的属性字段
  75. // 加载成功后执行事件
  76. ajaxSuccess: function(data){
  77. // 左上角增加新增按钮,同表格下的新增。
  78. $('#jqgh_testDataChildDataGrid_rn').append('<a href="javascript:" onclick="'
  79. + '$(\'#testDataChildDataGridAddRowBtn\').click();"><i class="fa fa-plus"></i></a>');
  80. }
  81. });

选择编辑行、单行编辑

  • 选择行后,当前选择的行设置为编辑状态
  • 其它非选择行的数据,还原非编辑状态
  1. onSelectRow: function(id) {
  2. if (id){
  3. // 选择行后,编辑此行数据
  4. var dg = $('#dataGrid');
  5. if (window.lastSelRow != id){
  6. dg.dataGrid('saveRow', window.lastSelRow);
  7. dg.dataGrid('editRow', id, {keys:true, focusField:false});
  8. window.lastSelRow = id;
  9. }
  10. }
  11. },

删除按钮自定义回调

  1. actions.push('<a href="${ctx}/sys/config/delete?id=' + row.id + '" class="btnList" title="删除参数"'
  2. + ' data-confirm="确认要删除该参数吗?" data-confirm-success="alert(\'我是回调\')">'
  3. + '<i class="fa fa-trash-o"></i></a>&nbsp;');

保存表单后刷新列表

  1. $("#inputForm").validate({
  2. submitHandler: function(form){
  3. // 发送异步提交表单请求
  4. js.ajaxSubmitForm($(form), function(data){
  5. // 保存表单后提示结果消息
  6. js.showMessage(data.message);
  7. // 如果提交结果为true,则代表保存成功
  8. if(data.result == Global.TRUE){
  9. // 保存成功,后关闭当前Tab页签
  10. js.closeCurrentTabPage(function(contentWindow){
  11. // 这里是,在关闭当前Tab页签之前执行的回调方法
  12. // 参数 contentWindow 返回的是上一个Tab页签的 window 对象
  13. // 调用上一个页签window对象里的page()方法,刷新grid数据
  14. contentWindow.page();
  15. });
  16. }
  17. }, "json");
  18. }
  19. });

子表 嵌套表 subgrid

  1. // 初始化DataGrid对象
  2. $('#dataGrid').dataGrid({
  3. searchForm: $("#searchForm"),
  4. columnModel: [
  5. {header:'${text("单行文本")}', name:'testInput', index:'a.test_input', width:150, align:"left"},
  6. {header:'${text("多行文本")}', name:'testTextarea', index:'a.test_textarea', width:150, align:"left"},
  7. {header:'${text("状态")}', name:'status', index:'a.status', width:150, align:"center", formatter: function(val, obj, row, act){
  8. return js.getDictLabel(${@DictUtils.getDictListJson('sys_search_status')}, val, '${text("未知")}', true);
  9. }}
  10. ],
  11. // 双击表格行,打开页签
  12. ondblClickRow: function(id, rownum, colnum, event){
  13. js.addTabPage(null, '编辑数据', '${ctx}/test/testData/form?id='+id);
  14. },
  15. // 子表格支持演示
  16. subGrid: true,
  17. subGridRowExpanded: function (subgridId, rowId) {
  18. $('#'+subgridId).html('<h5><i class="icon-docs"></i> 子表数据</h5>'
  19. +'<table id="'+subgridId+'_subgrid"></table>');
  20. $('#'+subgridId+'_subgrid').dataGrid({
  21. url: '${ctx}/test/testData/subListData',
  22. postData: {'testData.id': rowId},
  23. autoGridHeight: function(){return 'auto'}, // 设置自动高度
  24. autoGridWidth: function(){return $("#"+subgridId).width();}, // 设置自动高度
  25. // 设置数据表格列
  26. columnModel: [
  27. {header:'${text("单行文本")}', name:'testInput', width:150},
  28. {header:'${text("日期时间")}', name:'testDatetime', width:150, align:"center"}
  29. ],
  30. // 加载成功后执行事件
  31. ajaxSuccess: function(data){
  32. }
  33. });
  34. },
  35. // 加载成功后执行事件
  36. ajaxSuccess: function(data){
  37. }
  38. });