经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
完美实现保存和加载easyui datagrid自定义调整列宽位置隐藏属性功能
来源:cnblogs  作者:阿新  时间:2019/10/9 10:38:56  对本文有异议

需求&场景

  例表查询是业务系统中使用最多也是最基础功能,但也是调整最平凡,不同的用户对数据的要求也不一样,所以在系统正式使用后,做为开发恨不得坐在业务边上,根据他们的要求进行调整,需要调整最多就是列的位置和宽度。非常麻烦,而且还会不停的变。最好的方式把这个功能放给用户,让用户自己去调整,并保存在本地,这样就不需要每次做调整了。

实现方法

  因为我这边的项目都是用easyui datagrid开发的,datagrid提供了对每一列宽度的手工调整和位置的拖动功能,但是并没有提供保存修改后属性功能,这里我们就需要对datagrid进行扩展,扩展新增一个保存功能,将修改后的属性保存到浏览器的localstorage,再新增一个初始化的时候读取localstorage的属性进行调整,就可以实现想要的功能了。

demo 网址 http://221.224.21.30:2020/Orders/Index

 

代码实现

  easyui datagrid 拖动调整列的位置功能官方已经提供扩展支持https://www.jeasyui.com/extension/columns_ext.php  下载地址 可以获得。

 

 

 

 现在还需要自定义扩展保存和加载的功能(columns-reset.js)

  1. (function ($) {
  2. function buildMenu(target) {
  3. const state = $(target).data('datagrid');
  4. //冻结列不允许修改属性和位置
  5. //const fields = $(target).datagrid('getColumnFields',true).concat($(target).datagrid('getColumnFields', false));
  6. const fields = $(target).datagrid('getColumnFields');
  7. if (!state.columnMenu) {
  8. state.columnMenu = $('<div></div>').appendTo('body');
  9. state.columnMenu.menu({
  10. onClick: function (item) {
  11. if (item.iconCls === 'tree-checkbox1') {
  12. $(target).datagrid('hideColumn', item.name);
  13. $(this).menu('setIcon', {
  14. target: item.target,
  15. iconCls: 'tree-checkbox0'
  16. });
  17. } else if (item.iconCls === 'tree-checkbox0') {
  18. $(target).datagrid('showColumn', item.name);
  19. $(this).menu('setIcon', {
  20. target: item.target,
  21. iconCls: 'tree-checkbox1'
  22. });
  23. } else if (item.iconCls === 'icon-save') {
  24. //保存配置
  25. }
  26. let opts = [];
  27. for (let i = 0; i < fields.length; i++) {
  28. const field = fields[i];
  29. const col = $(target).datagrid('getColumnOption', field);
  30. opts.push(col);
  31. }
  32. //将调整好的属性保存到localstorage中
  33. localStorage.setItem($(target).datagrid('options').id, JSON.stringify(opts));
  34. }
  35. });
  36. state.columnMenu.menu('appendItem', {
  37. text: '保存配置',
  38. name: 'saveconfigitem',
  39. iconCls: 'icon-save'
  40. });
  41. for (let i = 0; i < fields.length; i++) {
  42. const field = fields[i];
  43. const col = $(target).datagrid('getColumnOption', field);
  44. if (col.title !== undefined)
  45. state.columnMenu.menu('appendItem', {
  46. text: col.title,
  47. name: field,
  48. iconCls: !col.hidden ? 'tree-checkbox1' : 'tree-checkbox0'
  49. });
  50. }
  51. }
  52. return state.columnMenu;
  53. }
  54. $.extend($.fn.datagrid.methods, {
  55. columnMenu: function (jq) {
  56. return buildMenu(jq[0]);
  57. },
  58. resetColumns: function (jq) {
  59. return jq.each(function () {
  60. const opts = $(this).datagrid('options');
  61. const local = JSON.parse(localStorage.getItem(opts.id));
  62. //冻结的列不参与设置
  63. //const fields = $(this).datagrid('getColumnFields', true).concat($(this).datagrid('getColumnFields', false));
  64. //const fields = $(this).datagrid('getColumnFields');
  65. if (local !== null) {
  66. //load sort datagrid columns
  67. let sortcolumns = [];
  68. for (let i = 0; i < local.length; i++) {
  69. const field = local[i].field;
  70. const localboxwidth = local[i].boxWidth;
  71. const localwidth = local[i].width;
  72. const localhidden = local[i].hidden || false;
  73. let col = $(this).datagrid('getColumnOption', field);
  74. //修改列的宽度和隐藏属性
  75. col.boxWidth = localboxwidth;
  76. col.width = localwidth;
  77. col.hidden = localhidden;
  78. sortcolumns.push(col);
  79. }
  80. $(this).datagrid({
  81. columns: [sortcolumns]
  82. }).datagrid('columnMoving');
  83. }
  84. });
  85. }
  86. });
  87. })(jQuery);
columns-reset.js

datagrid 代码

  1. //初始化定义datagrid
  2. var $dg = $('#orders_datagrid');
  3. $(() => {
  4. //定义datagrid结构
  5. $dg.datagrid({
  6. rownumbers: true,
  7. checkOnSelect: false,
  8. selectOnCheck: true,
  9. idField: 'Id',
  10. sortName: 'Id',
  11. sortOrder: 'desc',
  12. remoteFilter: true,
  13. singleSelect: false,
  14. url: '/Orders/GetDataAsync',
  15. method: 'get',
  16. onClickCell: onClickCell,
  17. pagination: true,
  18. striped: true,
  19. onHeaderContextMenu: function (e, field) {
  20. e.preventDefault();
  21. $(this).datagrid('columnMenu').menu('show', {
  22. left: e.pageX,
  23. top: e.pageY
  24. });
  25. },
  26. onBeforeLoad: function () {
  27. //datagrid resize when jarvisWidgets resized.
  28. const that = $(this);
  29. $(window).on("resize.jarvisWidgets", () => {
  30. that.datagrid('resize');
  31. })
  32. },
  33. onLoadSuccess: function (data) {
  34. editIndex = undefined;
  35. },
  36. onCheck: function () {
  37. $("button[name*='deletebutton']").prop("disabled", false);
  38. },
  39. onUncheck: function () {
  40. },
  41. onSelect: function (index, row) {
  42. order = row;
  43. },
  44. onBeginEdit: function (index, row) {
  45. //const editors = $(this).datagrid('getEditors', index);
  46. },
  47. onEndEdit: function (index, row) {
  48. editIndex = undefined;
  49. },
  50. onBeforeEdit: function (index, row) {
  51. editIndex = index;
  52. row.editing = true;
  53. $("button[name*='deletebutton']").prop("disabled", false);
  54. $("button[name*='cancelbutton']").prop("disabled", false);
  55. $("button[name*='savebutton']").prop("disabled", false);
  56. $(this).datagrid('refreshRow', index);
  57. },
  58. onAfterEdit: function (index, row) {
  59. row.editing = false;
  60. $(this).datagrid('refreshRow', index);
  61. },
  62. onCancelEdit: function (index, row) {
  63. row.editing = false;
  64. editIndex = undefined;
  65. $("button[name*='deletebutton']").prop("disabled", false);
  66. $("button[name*='savebutton']").prop("disabled", true);
  67. $("button[name*='cancelbutton']").prop("disabled", true);
  68. $(this).datagrid('refreshRow', index);
  69. },
  70. frozenColumns: [[
  71. /*开启CheckBox选择功能*/
  72. { field: 'ck', checkbox: true },
  73. {
  74. field: 'action',
  75. title: '@Html.L("Command")',
  76. width: 85,
  77. sortable: false,
  78. resizable: true,
  79. formatter: function showdetailsformatter(value, row, index) {
  80. if (!row.editing) {
  81. return `<div class="btn-group"> <button onclick="showdetailswindow('${row.Id}', ${index})" class="btn btn-default btn-xs" title="查看明细" ><i class="fa fa-pencil-square-o"></i> </button> <button onclick="deleteRow('${row.Id}',${index})" class="btn btn-default btn-xs" title="删除记录" ><i class="fa fa-trash-o"></i> </button> </div>`;
  82. } else {
  83. return `<button class="btn btn-default btn-xs" disabled title="查看明细" ><i class="fa fa-pencil-square-o"></i> </button>`;
  84. }
  85. }
  86. }
  87. ]],
  88. columns: [[
  89. { /*Id*/
  90. field: 'Id',
  91. title: '<span class="required">@Html.DisplayNameFor(model => model.Id)</span>',
  92. width: 120,
  93. sortable: true,
  94. resizable: true,
  95. hidden: true
  96. },
  97. { /*订单号*/
  98. field: 'OrderNo',
  99. title: '<span class="required">@Html.DisplayNameFor(model => model.OrderNo)</span>',
  100. width: 130,
  101. hidden: false,
  102. editor: {
  103. type: 'textbox',
  104. options: { prompt: '@Html.DisplayNameFor(model => model.OrderNo)', required: true, validType: 'length[12,12]' }
  105. },
  106. sortable: true,
  107. resizable: true
  108. },
  109. { /*订单所属的客户*/
  110. field: 'Customer',
  111. title: '<span class="required">@Html.DisplayNameFor(model => model.Customer)</span>',
  112. width: 130,
  113. hidden: false,
  114. editor: {
  115. type: 'textbox',
  116. options: { prompt: '@Html.DisplayNameFor(model => model.Customer)', required: true, validType: 'length[0,30]' }
  117. },
  118. sortable: true,
  119. resizable: true
  120. },
  121. { /*发货地址*/
  122. field: 'ShippingAddress',
  123. title: '<span class="required">@Html.DisplayNameFor(model => model.ShippingAddress)</span>',
  124. width: 300,
  125. hidden: false,
  126. editor: {
  127. type: 'textbox',
  128. options: { prompt: '@Html.DisplayNameFor(model => model.ShippingAddress)', required: true, validType: 'length[0,200]' }
  129. },
  130. sortable: true,
  131. resizable: true
  132. },
  133. { /*备注*/
  134. field: 'Remark',
  135. title: '@Html.DisplayNameFor(model => model.Remark)',
  136. width: 260,
  137. hidden: false,
  138. editor: {
  139. type: 'textbox',
  140. options: { prompt: '@Html.DisplayNameFor(model => model.Remark)', required: false, validType: 'length[0,100]' }
  141. },
  142. sortable: true,
  143. resizable: true
  144. },
  145. { /*订单日期默认当天*/
  146. field: 'OrderDate',
  147. title: '<span class="required">@Html.DisplayNameFor(model => model.OrderDate)</span>',
  148. width: 120,
  149. align: 'right',
  150. hidden: false,
  151. editor: {
  152. type: 'datebox',
  153. options: { prompt: '@Html.DisplayNameFor(model => model.OrderDate)', required: true }
  154. },
  155. formatter: dateformatter,
  156. sortable: true,
  157. resizable: true
  158. },
  159. ]]
  160. }).datagrid('columnMoving')
  161. .datagrid('resetColumns');
  162. <script src="~/Scripts/easyui/plugins/columns-reset.js"></script>
order index.html

另外做一个小广告

本人可以利用一些业余时间承接一些小项目的开发,有需求的可以合作,下面是我做过的一些项目,开发周期1周出原型,每周与客户确认开发成果,1个月完成制定的功能,1-2周时间上线调优交付(包含源代码)费用差不多2-5万之间

一个简单TMS系统 1个月时间完成开发  DEMO http://221.224.21.30:2018/

 

 一个简单仓库QC加收出管理系统  1个月时间完成开发  DEMO http://221.224.21.30:2022/

 

  集卡运输系统  1个月时间完成开发  DEMO http://221.224.21.30:2021/

 

 

 

 

 

 

 

 

原文链接:http://www.cnblogs.com/neozhu/p/11639362.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号