商品graph帐票时,用(bootstrap)Handsontable做表格,手动实现数据排序
待解决的问题:
  若使用控件本身的排序,必须指定colHead,colHead不能被copy,若想表头被copy,只隐藏一行表头数据是行不通的,因为排序的时候表头数据会被排了
解决的大概思路
  给数据中的第一行加上click事件,点击实现排序,排序过的数组,用控件重新加载成表格,hot.loadData(data);
  不设置表头,将表头表示为第一行数据。
  在定义的第一行的渲染函数中,给该行数据绑定事件:bind.(“click”,function(){...})
其中遇到的问题:
  1.关于值传递。object1=object2,这样之后,不是将object2中的值复制一份给object1,而是将object2的地址给了object1一份,这样操作object1时即在操作object2,里面的内容会发生改变。
    解决办法:dataTmp=JSON.parse(JSON.stringify(src.Rows));
         将对象或者数组先转换成字符串JSON.stringfy,再由JSON.parse方法转换为json对象,复制给另一个对象内容,不是源对象的地址
  2.每一次bind一个事件的时候,避免出现绑定的一个事件执行多次(说明多次绑定了)

    解决办法:应该在每次绑定前确保该对象没有该类绑定事件$(td).off("click");

         先解除绑定(不用判断是否有绑定),再绑定

  var collen=0; //数据列数
for (var i=0;;i++) {
if (datashow.Rows[0]["F"+i]){
collen++;
}else {
break;
}
} var data={};
var arr=[];
for (var j=0;j<datashow.Rows.length;j++){
var tmpobj={};
for (var i=0;i<collen-1;i++) {//去掉元数据中的第3列
if (i<2){
// dataTmp2[j]["F"+i]=dataTmp[j]["F"+i]
tmpobj["F"+i]=datashow.Rows[j]["F"+i];
}else {
// dataTmp2[j]["F"+i]=dataTmp[j]["F"+(i+1)]
tmpobj["F"+i]=datashow.Rows[j]["F"+(i+1)];
}
}
arr.push(tmpobj);
}
data["Rows"]=arr;
copyDatatmp=data.Rows; var flg={"F0":2,"F2":2,"F3":2,"F8":2};
//表头渲染函数--手动添加排序功能
var headRenderer = function(instance, td, row, col, prop, value, cellProperties) {
Handsontable.renderers.TextRenderer.apply(this, arguments);
td.style.backgroundColor = '#00619C';
td.style.color = '#FFFFFF';
td.style.textAlign="center";
td.style.verticalAlign="middle";
td.style.overflow = 'hidden';
td.style.whiteSpace = 'nowrap';
td.style.textOverflow = 'ellipsis';
if (col==0||col==2) {//给1,2列加上排序功能
if (flg["F"+col]==2) {//0,1,2--数据状态 2数据原来的顺序,1数据增序,0数据减序
$(td).append("<span class='sortAble' style='background-image:url("+"images/icon/icon-sortable.png"+");background-repeat: no-repeat;background-position-y: 3px;background-position-x: 3px;'>&nbsp;&nbsp;&nbsp;</span>");
}else if(flg["F"+col]==0){
。。。
} else {
。。。
}
$(td).off("mouseover");//先解绑,后绑定
$(td).off("click");//
$(td).bind("mouseover",function(e){
this.style.cursor='pointer';
}); $(td).bind("click",function(e){
if (flg["F"+col]==2){
flg["F"+col]=0;
sortByCol(dataTmp,col,0);
} else if(flg["F"+col]==0){
。。。
} else {
。。。
}
return;
});
}
}
};
sortByCol=function(dataTmp,col,order) {//自定义一个排序函数
var dataTmp1=JSON.parse(JSON.stringify(dataTmp));//用数据的备份排序
if (order!=2) {
var name="F"+col;
dataTmp1.sort(byCol(name,order));
}
var allDataTmp = getAllData(headp, dataTmp2.Rows);
delete allDataTmp[0]["F"+collen];//删除 js对象中的某一个属性 pro={F1:1,F2:2} 删除F1--> delete pro["F1"] hot.loadData(allDataTmp);//重新加载handsontable的表格数据
} function byCol(propertyName,order) { //自定义的sort函数
return function(object1, object2){
var val1 = object1[propertyName];
var val2 = object2[propertyName];
// var reg = new RegExp("^[0-9]*$");
var reg = /^-?\d+\.?\d*$/;
var value1,value2;
if (reg.test(val1)&& reg.test(val2)){
value1=parseFloat(val1);
value2=parseFloat(val2);
}else {
value1=val1;
value2=val2;
}
if(order==0) {
if (value1 < value2){
return -1;
}else if (value1 > value2){
return 1;
}else {
return 0;
}
}else {
if (value1 > value2){
return -1;
}else if (value1 < value2){
return 1;
}else {
return 0;
}
}
}
}
var sumRenderer = function(instance, td, row, col, prop, value, cellProperties) {
Handsontable.renderers.TextRenderer.apply(this, arguments);
td.title = value;
if (mode==0&&outtype==0) {
if (col>3){
td.innerText = toMoney(value);
td.style.textAlign="right";
}else {
td.innerText = "合計";
td.style.textAlign="center";
}
td.style.fontWeight="bold";
}else if(mode==0&&outtype==1){
if (col>2){
td.innerText = toMoney(value);
td.style.textAlign="right";
}else {
td.innerText = "合計";
td.style.textAlign="center";
}
td.style.fontWeight="bold";
} td.style.color = '#000000'; td.style.verticalAlign="middle";
td.style.overflow = 'hidden';
td.style.whiteSpace = 'nowrap';
td.style.textOverflow = 'ellipsis'; };
// var n=0; var dataRenderer = function(instance, td, row, col, prop, value, cellProperties) {
Handsontable.renderers.TextRenderer.apply(this, arguments);
var key="R"+row;
//var d=data.Rows[row];
var d=instance.getData()[row];
if (mode>0&&d["F6"].indexOf("退")>-1) {
td.style.backgroundColor = '#AAAAAA';
} td.title = value;
if (mode==1&&col>7) {
if (value.indexOf("_")>0) {
td.innerText = toMoney(value.split("_")[0]);
}else {
td.innerText = toMoney(value);
}
}
td.style.color = '#000000';
td.style.verticalAlign="middle";
td.style.overflow = 'hidden';
td.style.whiteSpace = 'nowrap';
td.style.textOverflow = 'ellipsis';
}; $('#grid').empty();
h = document.documentElement.clientHeight - 220;
$('#grid').css("height",h);
var container = document.getElementById('grid');
var mergeCell={};
var fozenCol=0;
if (mode==0&&outtype==0) {
mergeCell={row: 1, col: 0, rowspan: 1, colspan:4};
fozenCol=4;
}else if(mode==0&&outtype==1){
mergeCell={row: 1, col: 0, rowspan: 1, colspan:3};
fozenCol=3;
}else {
fozenCol=9;
}
hot = new Handsontable(container, {
data:data.Rows,
fixedRowsTop: 1,
fixedColumnsLeft: fozenCol,
autoColumnSize:true,
fillHandle:true,
// colHeaders:colHeadersflg, currentRowClassName: 'currentRow',
cell: [
{row: 0, col: 0, className: "htMiddle"} //居中
],
cells: function (row, col, prop) {
var cellPropertiess = {};
if(row==0){
cellPropertiess.renderer = headRenderer;
}else if(mode==0&&row==1){
cellPropertiess.renderer = sumRenderer;
}else {
cellPropertiess.renderer = dataRenderer;
}
cellPropertiess.readOnly = true;
return cellPropertiess;
},
mergeCells: [mergeCell]
});
init(mode,outtype);

 

用(bootstrap)Handsontable做表格,手动实现数据排序的更多相关文章

  1. 【Bootstrap】 bootstrap-table表格组件

    [Bootstrap-table] 顾名思义,这个组件专注于bootstrap风格的表格的设计,并且提供了很多表格的基础和进阶的功能,给我们开发前端的表格省下很多力气. 本文主要参考这位博主的系列文章 ...

  2. 读取Excel表格日期类型数据的时候

    用POI读取Excel数据:(版本号:POI3.7) 1.读取Excel 2.Excel数据处理: Excel存储日期.时间均以数值类型进行存储,读取时POI先判断是是否是数值类型,再进行判断转化 1 ...

  3. ajax异步获取数据后动态向表格中添加数据(行)

    因为某些原因,项目中突然需要做自己做个ajax异步获取数据后动态向表格中添加数据的页面,网上找了半天都没有 看到现成的,决定自己写个例子 1.HTML页面 <!doctype html> ...

  4. 爬取表格类网站数据并保存为excel文件

    本文转载自以下网站:50 行代码爬取东方财富网上市公司 10 年近百万行财务报表数据 https://www.makcyun.top/web_scraping_withpython6.html 主要学 ...

  5. 【JAVA】JSP+layui框架 静态表格转化成数据表格

    <table lay-filter="demo" class="layui-table" id="excTable"> < ...

  6. Vue电商后台管理系统项目第2天-首页添加表格动态渲染数据&分页

    0x01.使用Github学习的姿势 基于昨天的内容,今天的内容需要添加几个单文件组件,路由文件也需要做相应的增加,今天重点记录使用Element-UI中的表格组件实现数据动态渲染的实现流程和分页功能 ...

  7. 在MVC模式下通过Jqgrid表格操作MongoDB数据

    看到下图,是通过Jqgrid实现表格数据的基本增删查改的操作.表格数据增删改是一般企业应用系统开发的常见功能,不过不同的是这个表格数据来源是非关系型的数据库MongoDB.nosql虽然概念新颖,但是 ...

  8. 从excel表格加载数据返回DataSet

    添加命名空间:using System.Data.OleDb; /// <summary> /// 从excel表格加载数据返回DataSet /// </summary> / ...

  9. 用div加css做表格去掉外围边框

    通过div做表格时想加上边框,并且想取点外围边框: <div class="cont"> <div class="row"> <a ...

随机推荐

  1. Spring Cloud学习路线

    学习本学习路线学习完,大家将会对微服务.Spring Cloud.Docker.Kubernetes有一个系统.全面的认识.通过学习,将能掌握相关的知识体系,并能够投入到项目实战中去. 本学习路线采用 ...

  2. 关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)(转)

    这篇文章给大家介绍关于Mysql中文乱码问题该如何解决(乱码问题完美解决方案)的相关资料,还给大家收集些关于MySQL会出现中文乱码原因常见的几点,小伙伴快来看看吧   最近两天做项目总是被乱码问题困 ...

  3. MYSQL 之SET GLOBAL innodb_buffer_pool_size =n

    工作遇到一个情况是索引相同的情况下,mysql服务在linux上运行很快,在windows服务器上运行很慢,版本是V5.7以后得版本,同事查找了下说应该设置 SET GLOBAL innodb_buf ...

  4. hdu-2688 Rotate---树状数组+模拟

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2688 题目大意: 给你n数,(n<=3e6),有两个操作,Q为 当前有多少对数,满足严格递增, ...

  5. 前端高质量知识(四)-JS详细图解作用域链与闭包

    攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你是初入前端的朋友,我没有办法 ...

  6. Ubuntu 16.04 安装札记

    写在前面的话:第一次写,有点紧张,不知道怎么写,就胡乱写了,主要是写给自己看的,感觉这里大神遍地都是,大牛更是数不胜数,我就一小白,记下来怕以后忘了,言归正传,我初步打算是把这篇博客写成安装指南(捂脸 ...

  7. 【转】android gravity属性 和 weight属性

    有点忘记这两个属性了,复习一下. 来看这个布局文件 <?xml version="1.0" encoding="utf-8"?> <Linea ...

  8. 启动Windows服务

    实现效果: 知识运用: ServiceController类的ServiceName Status属性 public string ServiceName {get; set;} //对此Servic ...

  9. Entity Framework的扩展库

    https://github.com/jcachat/EntityFramework.DynamicFilters Provides global & scoped filters for E ...

  10. ThinkPHP:create()方法有什么用呢?

    1.create方法可以对POST提交的数据进行处理(通过表中的字段名称与表单提交的名称对应关系自动封装数据实例),例如user表中有一个字段名叫"username",如果表单中有 ...