找回密码
 立即注册

QQ登录

只需一步,快速开始

koko

注册会员

4

主题

11

帖子

192

积分

注册会员

积分
192
最新发帖
koko
注册会员   /  发表于:2019-8-5 15:43  /   查看:3225  /  回复:6
1金币
本帖最后由 koko 于 2019-8-5 15:44 编辑

按照官方的demo做的,新增了2列表头,第一列是勾选框,第二列是自定义文本
勾选框事件无法触发
image.png736034240.png
源码
  1. <style>
  2.   .common-table-list {
  3.     background-color: #fff;
  4.     padding: 0 0;
  5.   }

  6.   #shipment {
  7.     width: 100%;
  8.     height: 650px;
  9.     border: 1px solid #56b7e9;
  10.   }
  11. </style>

  12. <div class="layui-fluid nepadmin-pad0 nepadmin-mar0" id="VIEW-order-list-table" lay-title="$t('运单列表')"
  13.      v-auth="/order/list">
  14.   <div class="common-pad">
  15.     <ul class="common-tab-outer" id="menuOrderListContent">
  16.       <!-- <li class="inner-this"><a lay-href="/order/list">$t('运单列表')</a></li> -->
  17.     </ul>
  18.   </div>
  19.   <div class="common-content-outer">
  20.     <div class="search-form">
  21.       <form class="layui-form layui-row layui-col-space10" id="formOrder" lay-filter="formOrderData">
  22.         <div class="layui-inline-select">
  23.           <select name="order_status" lay-search lay-filter="orderFormVal"></select>
  24.         </div>
  25.         <div class="layui-inline-time layui-inline-select">
  26.           <div class="layui-row">
  27.             <div class="layui-col-md5">
  28.               <select name="order_time" lay-filter="orderFormVal"></select>
  29.             </div>
  30.             <div class="layui-col-md7">
  31.               <input type="text" name="time" id="searchDateShipment" placeholder="$t('请选择时间范围')" autocomplete="off"
  32.                      class="layui-input" readonly>
  33.             </div>
  34.           </div>
  35.         </div>
  36.         <div class="layui-inline-input">
  37.           <input type="text" name="keyword" class="layui-input jsKeyword" autocomplete="off"
  38.                  placeholder="$t('请输入运单号/物流单号/买家/商品名称/商品SKU/商品SPU')">
  39.         </div>
  40.         <div class="layui-inline-btn">
  41.           <button class="layui-btn layui-btn-sm layui-btn-default" lay-submit lay-filter="searchOrder">
  42.             <i style="display: none"
  43.                class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>
  44.             $t('查询')
  45.           </button>
  46.         </div>
  47.         <div class="layui-inline-btn">
  48.           <button class="layui-btn layui-btn-sm layui-btn-default" lay-submit lay-filter="payShipment">
  49.             <i style="display: none"
  50.                class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i>
  51.             $t('付款')
  52.           </button>
  53.         </div>
  54.       </form>
  55.     </div>
  56.     <div class="common-table-list">
  57.       <div id="shipment"></div>
  58.     </div>
  59.   </div>
  60. </div><!-- 顶部菜单 -->

  61. <script>
  62.   layui.use(['admin', 'table', 'form', 'dropdown', 'jquery', 'laydate', 'i18n', 'laytpl', 'view'], function (admin, table, form, dropdown, $, laydate, i18n, laytpl, view) {

  63.     var spread = new GC.Spread.Sheets.Workbook(document.getElementById("shipment"), {
  64.       tabStripVisible: false, // 隐藏sheet栏
  65.       scrollbarMaxAlign: false, // 滚动条对齐表单最后一个数据
  66.     })
  67.       , sheet = spread.getActiveSheet()
  68.       , spreadNS = GC.Spread.Sheets
  69.       , oldJson = {}
  70.       , saveJson = {}
  71.       , template = {}
  72.       , templateMaxY = 2
  73.       , excelIo = new GC.Spread.Excel.IO();
  74.     // spread.options.allowUndo = true; // 允许撤销操作


  75.     var id = layui.router().search.id;
  76.     admin.get({
  77.       url: 'v1/supplier/' + id + '?expand=excel_template&fields=id',
  78.       success: function (res) {
  79.         init(res.data);
  80.       }
  81.     });


  82.     function getSelect() {
  83.       var spread = GC.Spread.Sheets.findControl("ss");
  84.       var sheet = spread.getActiveSheet();
  85.       // 获取选中行数据
  86.       var checkedRows = [];
  87.       for (var i = 0; i < sheet.getRowCount(); i++) {
  88.         var checkboxValue = sheet.getValue(i, 0);
  89.         if (checkboxValue) {
  90.           checkedRows.push(i);
  91.         }
  92.       }
  93.       for (var i = 0; i < checkedRows.length; i++) {
  94.         console.log(sheet.getValue(checkedRows[i], 1));
  95.         console.log(sheet.getValue(checkedRows[i], 2));
  96.       }
  97.     }


  98.     function init(data) {
  99.       if (!data.excel_template) {
  100.         form.val('excel-form', {
  101.           id: data.id
  102.         });
  103.         form.render();
  104.         return;
  105.       } else {
  106.         var field = data.excel_template.field || {}
  107.           , excel = data.excel_template.excel || {};
  108.         form.val('excel-form', {
  109.           ...data.excel_template.field,
  110.           id: data.id
  111.         });
  112.         form.render();
  113.       }
  114.       if (excel) {
  115.         template = data.excel_template.bind;
  116.         templateMaxY = data.excel_template.maxy;
  117.         renderData(excel, parseInt(field.title_begin), parseInt(field.title_end));
  118.       }
  119.     }


  120.     function randomNum(minNum, maxNum) {
  121.       switch (arguments.length) {
  122.         case 1:
  123.           return parseInt(Math.random() * minNum + 1, 10);
  124.           break;
  125.         case 2:
  126.           return parseInt(Math.random() * (maxNum - minNum + 1) + minNum, 10);
  127.           break;
  128.         default:
  129.           return 0;
  130.           break;
  131.       }
  132.     }


  133.     form.on('submit(payShipment)', function (data) {
  134.       var data = [];
  135.       // 获取选中行数据
  136.       var checkedRows = [];
  137.       for (var i = 0; i < sheet.getRowCount(); i++) {
  138.         var checkboxValue = sheet.getValue(i, 0);
  139.         if (checkboxValue) {
  140.           checkedRows.push(i);
  141.         }
  142.       }
  143.       admin.modal.success('选中第' + checkedRows + '运单进行付款');
  144.       return false;
  145.       for (var i = 0; i < checkedRows.length; i++) {
  146.         console.log(sheet.getValue(checkedRows[i], 1));
  147.         console.log(sheet.getValue(checkedRows[i], 2));
  148.       }

  149.       return false;
  150.     });


  151.     function mockData() {
  152.       var data = []
  153.         , total = randomNum(10, 50);
  154.       for (var i = 0; i < total; i++) {
  155.         data.push({
  156.           CustomerName: 'CTC',
  157.           ShipmentType: 'Drop',
  158.           BU: 'XXX',
  159.           HAWBNo: 'SIN' + randomNum(1000000, 9999999),
  160.           PONo: 'EBE19116 ' + randomNum(1000000, 9999999),
  161.           Shipper: 'Life Technologies Holdings Pte Ltd ',
  162.           OriginSite: 'Singapore',
  163.           OriginAirport: 'SIN',
  164.           OriginCountry: 'SG',
  165.           DestAirport: 'PVG',
  166.           DestCity: 'Hefei',
  167.           DestCountry: 'cn',
  168.           DestinationCurrency: 'CNY',
  169.           FreightRate: Math.random() * 10,
  170.           PayStatus: Math.random() * 10 > 5 ? 'Yes' : 'No'
  171.         })
  172.       }

  173.       return data;
  174.     }


  175.     function renderData(excel, begin, end) {
  176.       spread.fromJSON(JSON.parse(excel), {
  177.         tabStripVisible: false, // 隐藏sheet栏
  178.         scrollbarMaxAlign: false, // 滚动条对齐表单最后一个数据
  179.       });
  180.       sheet = spread.getActiveSheet();
  181.       // sheet.options.isProtected = true;
  182.       // 停止渲染
  183.       sheet.suspendPaint();
  184.       // 隐藏表头
  185.       // sheet.options.rowHeaderVisible = false;
  186.       // sheet.options.colHeaderVisible = false;

  187.       // 新增表头
  188.       sheet.setColumnCount(2, spreadNS.SheetArea.rowHeader);
  189.       sheet.options.rowHeaderAutoTextIndex = 0;
  190.       sheet.options.rowHeaderAutoText = spreadNS.HeaderAutoText.blank;

  191.       // 冻结表头
  192.       sheet.frozenRowCount(end);
  193.       // sheet.frozenColumnCount(2);
  194.       // 合并勾选框 付款状态
  195.       sheet.addSpan(0, 0, 2, 1, GC.Spread.Sheets.SheetArea.rowHeader);
  196.       sheet.addSpan(0, 1, 2, 1, GC.Spread.Sheets.SheetArea.rowHeader);
  197.       // 设置勾选框 付款状态
  198.       var style = new GC.Spread.Sheets.Style();
  199.       style.backColor = '#56b7e9'
  200.       style.foreColor = 'white'
  201.       style.vAlign = GC.Spread.Sheets.VerticalAlign.center
  202.       style.hAlign = GC.Spread.Sheets.HorizontalAlign.center
  203.       sheet.setStyle(-1, 0, style, GC.Spread.Sheets.SheetArea.rowHeader);
  204.       sheet.setStyle(-1, 1, style, GC.Spread.Sheets.SheetArea.rowHeader);

  205.       // 勾选框不锁定
  206.       // style.locked = false
  207.       sheet.setCellType(0, 0, new MyCheckBoxCellType(), GC.Spread.Sheets.SheetArea.rowHeader);
  208.       sheet.getCell(0, 1, GC.Spread.Sheets.SheetArea.rowHeader).width(150)
  209.         .text('Status').backColor('#56b7e9').foreColor('white')
  210.         .vAlign(GC.Spread.Sheets.VerticalAlign.center)
  211.         .hAlign(GC.Spread.Sheets.HorizontalAlign.center)

  212.       renderTemplate(begin, mockData())
  213.     }


  214.     function getTemplateData(index, data) {
  215.       if (!template[index]) {
  216.         return '';
  217.       }
  218.       var name = template[index].name;
  219.       if (!data[name]) {
  220.         return '';
  221.       }

  222.       return data[name];
  223.     }


  224.     function renderTemplate(end, data) {
  225.       // 根据数据数量生成新行
  226.       var length = data.length;
  227.       sheet.addRows(end + 1, length - 1);
  228.       // 循环生成勾选框
  229.       for (var i = 0; i < length; i++) {
  230.         var c = new GC.Spread.Sheets.CellTypes.CheckBox()
  231.           , x = i + parseInt(end)
  232.           , rowData = data[i] || {};
  233.         // c.textAlign(GC.Spread.Sheets.CellTypes.CheckBoxTextAlign.right);
  234.         sheet.setCellType(x, 0, c, GC.Spread.Sheets.SheetArea.rowHeader);
  235.         sheet.getCell(x, 1, GC.Spread.Sheets.SheetArea.rowHeader).text(rowData.PayStatus).foreColor(rowData.PayStatus == 'Yes' ? 'white' : 'red'); // 付款状态

  236.         // 单元格赋值
  237.         for (var y = 0; y < templateMaxY; y++) {
  238.           var cellData = getTemplateData(y, rowData);
  239.           if (cellData) {
  240.             sheet.setValue(x, y, cellData);
  241.           }
  242.         }
  243.       }
  244.       sheet.resumePaint();
  245.       // 绑定勾选框事件
  246.       spread.bind(GC.Spread.Sheets.Events.ButtonClicked,
  247.         function (e, args) {
  248.         alert(args);
  249.           var sheet = args.sheet,
  250.             row = args.row,
  251.             col = args.col;
  252.           var cellType = sheet.getCellType(row, col);
  253.           if (cellType instanceof GC.Spread.Sheets.CellTypes.CheckBox) {
  254.             var colHeaderCell = cellType = sheet.getCell(0, col, GC.Spread.Sheets.SheetArea.rowHeader);
  255.             if (colHeaderCell.cellType() instanceof MyCheckBoxCellType) {
  256.               var checkStatus = true;
  257.               for (var i = 0; i < sheet.getRowCount(); i++) {
  258.                 var cell = sheet.getCell(i, col);
  259.                 if (cell.cellType() instanceof GC.Spread.Sheets.CellTypes.CheckBox && !cell.value()) {
  260.                   checkStatus = false;
  261.                   break;
  262.                 }
  263.               }
  264.               colHeaderCell.tag(checkStatus);
  265.               sheet.repaint();
  266.             }
  267.           }
  268.         });
  269.     }


  270.     var viewPage = $('#VIEW-order-list-table');
  271.     var tableFilter = 'order-list-table';
  272.     var routeStatus = admin.route.search.status;
  273.     var selectTpl = document.getElementById('select-tpl').innerHTML;


  274.     // 初始化
  275.     admin.get({
  276.       url: 'v1/basic?fields=order_status,warehouse,shop,order_time',
  277.       success: function (res) {
  278.         var data = res.data;
  279.         if (routeStatus) {
  280.           renderSelect(data.order_status, 'order_status');
  281.           form.val("formOrderData", {
  282.             "order_status": routeStatus
  283.           })
  284.           form.render();
  285.         } else {
  286.           renderSelect(data.order_status, 'order_status');
  287.         }
  288.         renderSelect(data.order_time, 'order_time');
  289.         form.render();
  290.       }
  291.     });

  292.     // 渲染通用下拉框
  293.     function renderSelect(data, name) {
  294.       var container = $('select[name=' + name + ']');
  295.       laytpl(selectTpl).render(data, function (html) {
  296.         if (name == 'order_status') {
  297.           html = '<option value="">' + i18n.t('全部状态') + '</option>' + html;
  298.         }
  299.         if (name == 'order_time') {
  300.           html = '<option value="">' + i18n.t('全部时间') + '</option>' + html;
  301.         }
  302.         container.html(html);
  303.       });
  304.     }

  305.     // 搜索
  306.     var arrForm = []; // 取出表单的value值
  307.     var objField = {}; // 存储表单的value值,方便提交
  308.     // select搜索
  309.     form.on('select(orderFormVal)', function (data) {
  310.       arrForm = $('#formOrder').serializeArray();
  311.       for (var i in arrForm) {
  312.         objField.order_status = arrForm[0].value
  313.         objField.warehouse_id = arrForm[1].value
  314.         objField.shop_id = arrForm[2].value
  315.         objField.order_time = arrForm[3].value
  316.         objField.time = arrForm[4].value
  317.         objField.keyword = arrForm[5].value
  318.       }
  319.       reloadTable(objField)
  320.     });
  321.     // 时间搜索
  322.     laydate.render({
  323.       elem: '#searchDateShipment',
  324.       range: '~',
  325.       done: function (value, date, endDate) {
  326.         arrForm = $('#formOrder').serializeArray();
  327.         for (var i in arrForm) {
  328.           objField.order_status = arrForm[0].value
  329.           objField.warehouse_id = arrForm[1].value
  330.           objField.shop_id = arrForm[2].value
  331.           objField.order_time = arrForm[3].value
  332.           objField.time = value
  333.           objField.keyword = arrForm[5].value
  334.         }
  335.         reloadTable(objField)
  336.       }
  337.     });


  338.     // 下载ssjson文件方法
  339.     var funDownload = function (content, filename) {
  340.       var eleLink = document.createElement('a');
  341.       eleLink.download = filename;
  342.       eleLink.style.display = 'none';
  343.       // 字符内容转变成blob地址
  344.       var blob = new Blob([content]);
  345.       eleLink.href = URL.createObjectURL(blob);
  346.       // 触发点击
  347.       document.body.appendChild(eleLink);
  348.       eleLink.click();
  349.       // 然后移除
  350.       document.body.removeChild(eleLink);
  351.     };

  352.     // 点击按钮,导出当前页面的ssjson文件。
  353.     $("#saveSsjson").click(function () {
  354.       var testJson = JSON.stringify(spread.toJSON());
  355.       funDownload(testJson, "test.ssjson");
  356.     });


  357.     // 导出事件
  358.     $("#saveExcel").click(function () {

  359.       var fileName = $("#exportFileName").val();
  360.       var password = $("#password").val();
  361.       if (fileName.substr(-5, 5) !== '.xlsx') {
  362.         fileName += '.xlsx';
  363.       }

  364.       // 导出到excel中,包括绑定的数据
  365.       var json = spread.toJSON({
  366.         includeBindingSource: true
  367.       });

  368.       // here is excel IO API
  369.       excelIo.save(json, function (blob) {
  370.         saveAs(blob, fileName);
  371.       }, function (e) {
  372.         // process error
  373.         console.log(e);
  374.       }, {password: password});

  375.     });


  376.     function MyCheckBoxCellType() {
  377.       GC.Spread.Sheets.CellTypes.CheckBox.apply(this);
  378.       this.caption("All");
  379.     }

  380.     MyCheckBoxCellType.prototype = new GC.Spread.Sheets.CellTypes.CheckBox();
  381.     var basePaint = GC.Spread.Sheets.CellTypes.CheckBox.prototype.paint;
  382.     MyCheckBoxCellType.prototype.paint = function (ctx, value, x, y, width, height, style, context) {

  383.       //var tag = context.sheet.getColumn(context.col,context.sheetArea).tag();
  384.       var tag = context.sheet.getTag(context.row, context.col, context.sheetArea);
  385.       if (tag !== true) {
  386.         tag = false;
  387.       }
  388.       basePaint.apply(this, [ctx, tag, x, y, width, height, style, context]);
  389.     };
  390.     MyCheckBoxCellType.prototype.getHitInfo = function (x, y, cellStyle, cellRect, context) {
  391.       if (context) {
  392.         return {
  393.           x: x,
  394.           y: y,
  395.           row: context.row,
  396.           col: context.col,
  397.           cellRect: cellRect,
  398.           sheetArea: context.sheetArea,
  399.           isReservedLocation: true,
  400.           sheet: context.sheet
  401.         };
  402.       }
  403.       return null;
  404.     };

  405.     MyCheckBoxCellType.prototype.processMouseUp = function (hitInfo) {

  406.       var sheet = hitInfo.sheet,
  407.         row = hitInfo.row,
  408.         col = hitInfo.col,
  409.         sheetArea = hitInfo.sheetArea;

  410.       if (sheet.getCell(0, 0, GC.Spread.Sheets.SheetArea.colHeader).locked() && sheet.options.isProtected) {
  411.         return;
  412.       }

  413.       var tag = sheet.getTag(row, col, sheetArea);
  414.       //var tag = sheet.getColumn(col,sheetArea).tag();
  415.       if (tag === undefined || tag === null) { //first time
  416.         sheet.setTag(row, col, true, sheetArea);
  417.         //sheet.getColumn(col,sheetArea).tag(true)
  418.       } else {
  419.         sheet.setTag(row, col, !tag, sheetArea);
  420.         //sheet.getColumn(col,sheetArea).tag(!tag)
  421.       }
  422.       //add your code here
  423.       tag = sheet.getTag(row, col, sheetArea);
  424.       //tag = sheet.getColumn(col,sheetArea).tag();
  425.       // sheet.setValue(-1, 0, tag);
  426.       sheet.suspendPaint();
  427.       for (var i = 0; i < sheet.getRowCount(); i++) {
  428.         var cell = sheet.getCell(i, col);
  429.         if (cell.cellType() instanceof GC.Spread.Sheets.CellTypes.CheckBox) {
  430.           cell.value(tag);
  431.         }
  432.       }
  433.       sheet.resumePaint();
  434.     };

  435.     Array.prototype.clone = function () {
  436.       let a = [];
  437.       for (let i = 0, l = this.length; i < l; i++) {
  438.         a.push(this[i]);
  439.       }
  440.       return a;
  441.     };


  442.   })
  443. </script>
复制代码


最佳答案

查看完整内容

您好,您把Checkbox都放到了列头区域,那么所有对checkbox的操作都应该针对列头区域执行操作, 我举例说一下,在你贴的代码的第282行, 根据API,应该还需要传一个参数,指明这里获取的celltype是拿的行头单元格类型, https://demo.grapecity.com.cn/spreadjs/help/v12/content/webframe.html#SpreadJS~GC.Spread.Sheets.Worksheet~getCellType.html 这里可选值的API为: https://demo.grapecity.com.cn/s ...

6 个回复

倒序浏览
最佳答案
最佳答案
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-8-5 15:43:34
来自 3#
您好,您把Checkbox都放到了列头区域,那么所有对checkbox的操作都应该针对列头区域执行操作,

我举例说一下,在你贴的代码的第282行,

  1. var cellType = sheet.getCellType(row, col);
复制代码


根据API,应该还需要传一个参数,指明这里获取的celltype是拿的行头单元格类型,

https://demo.grapecity.com.cn/sp ... et~getCellType.html

image.png827487182.png

这里可选值的API为:

https://demo.grapecity.com.cn/sp ... eets.SheetArea.html
回复 使用道具 举报
koko
注册会员   /  发表于:2019-8-5 15:45:14
2#
录了个屏~~ 竟然不支持gift。。。
回复 使用道具 举报
koko
注册会员   /  发表于:2019-8-6 11:47:44
4#
感谢回复,这个已经修正,现在的问题是勾选框点击事件没有被触发
image.png541708068.png
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-8-6 18:18:22
5#
您好,您注意一下这个Demo:

https://demo.grapecity.com.cn/Sp ... olumnHeaderCheckBox

实际上它触发的是这个自定义的processMouseUp事件,如图:

image.png897156982.png
回复 使用道具 举报
koko
注册会员   /  发表于:2019-8-7 10:53:08
6#
image.png738451232.png
image.png127556456.png
不知道是不是在表头的checkBox 要自定义的对象~~ 系统内置的对象不生效啊
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2019-8-7 13:52:11
7#
我解释一下,列头的checkbox选框,包括corner位置的checkbox,都是自定义单元格实现的,

它们的逻辑都需要自己写到processMouseUp事件中,在事件中自己编写逻辑执行它们的操作,

你注意一下Demo的processMouseUp事件的逻辑:

image.png508051452.png

实际上这里自己实现了一个当点击checkbox的行为逻辑。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部