`
wdzwdz
  • 浏览: 32071 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

给dhtmlxGrid增加列合并功能 colspan

阅读更多
最近使用 dhtmlxGrid的时候,需要使用其列合并功能,但是该功能dhtmlXGridObject 的setColspan 方法在GPL版本中并不存在,所以只好自己动手实现。

例子,请参考附件
1、列合并功能的描述
<h3>操作习惯遵从Excel 的单元合并</h3>
  <p>
  <li>为简化列合并操作,模仿excel 的单元格合并。
  <li>第一次合并指定范围的列,例如: meregeCellsMainDetail(0,2,3);
  <li><B>相等</B>:如果第二次合并的范围和第一次范围<B>相同</B>,例如: setColspan(0,2,3);是取消合并
  <li><B>包含</B>:如果第二次合并的范围<B>包含</B>第一次范围相同,例如:setColspan(0,2,4);是取消合并
  <li><B>被包含</B>:如果第二次合并的范围<B>被包含</B>在第一次范围内部,例如:setColspan(0,2,2);是取消合并
</p>
<p>
  存在前端交叉的 合并
  <li>第一次合并指定范围的列,例如: setColspan(0,2,3);
   <li>交叉第二次合并指定范围的列,例如: setColspan(0,4,2);是取消合并 </li>
</p>
<p>
  存在后端交叉的 合并
  <li>第一次合并指定范围的列,例如: setColspan(0,2,3);
   <li>交叉第二次合并指定范围的列,例如: setColspan(0,0,3);是取消合并 </li>
</p>
<BR/>

2.实现脚本
/*******************
dhtmlxgrid 列表合并 colspan
如果对 一行进行多次列合并可能有问题
@return 如果 colspan 大于1, true=  合并成功 ,false =取消合并
@author  wdz123@hotmail.com
@date 2009-01-28
example: mygrid.setColspan(1,2,2); mygrid.setColspan(1,6,3);
*/
dhtmlXGridObject.prototype.setColspan = function(row_id, col_ind, colspan){
//setColspan(row_id, col_ind, colspan) [
var tr ;
tr = this.getRowById(row_id);  
if(tr == 'undefined' || tr == null){
return false ;
}
var colspancount = colspan;
var j = tr.childNodes.length ;
//检查边界
     if(colspancount <= 1){
   return false ;  
}
var kk = (col_ind + colspancount );
if(j < kk){
  colspancount = j  -  col_ind;
}
//alert('step 1');
var my = new _dhtmlXGridObjectColSpan();
return my._meregeCells(tr,col_ind,colspancount);
}

//dhtmlXGridObject  列合并内部对象
function _dhtmlXGridObjectColSpan () {
   //判断是否允许列合并
  //decide may merge  cells
  this._canMergeCells = function( tr,col_ind, colspan){
    var  canMerge = true;
var  k ;
var y = (parseInt(col_ind) + parseInt(colspan ));
var i;
i  = col_ind;
while( i <  y && canMerge ){
  if(tr.childNodes[i] && tr.childNodes[i].colSpan){
    k = tr.childNodes[i].colSpan;
if(k>1){
   canMerge  = false;
  // i =  y  +1;
}

if(tr.childNodes[i].style  && tr.childNodes[i].style.display){
    k = tr.childNodes[i].style.display;
if(k=='none' || k == 'NONE'){
   canMerge  = false;
     //  i = y  +1;
}
}

  }
  i ++ ;  
}
//alert('canMerge=' + canMerge)
return canMerge;
  };

   //寻找取消合并的开始位置
  //find  first  cancel merge cell position
  //tr is table  row object
   this._findBeginMergePos  = function(tr,col_ind){
    var i = col_ind;
var flag = true;
var tmp ;
var result  = col_ind;
if(tr.childNodes[col_ind].style && tr.childNodes[col_ind].style.display){
    tmp  = tr.childNodes[col_ind].style.display;
if(tmp=="none" ||tmp == "NONE"){
    //需要找到合并开始点
//need find
}else{
  flag  = false ;
}
}
while(flag && i>=0) {
   if(tr.childNodes[i].colSpan){
      tmp = tr.childNodes[i].colSpan;
  if(tmp>1){   
     result = i;
flag = false;
   }
}
i = i -1;
}
if(flag){   
  result = 0 ;
}
return result;
  };
 
    //寻找取消合并的结束位置
  //cellsCount is the row cells'count
   this._findEndMergePos = function(tr,col_ind,cellsCount){
    var i = col_ind;
var flag = true;
var tmp ;
var result  = col_ind  ;
//alert('_findEndMergePos,col_ind='+col_ind)
if(tr.childNodes[col_ind].style && tr.childNodes[col_ind].style.display){
    tmp  = tr.childNodes[col_ind].style.display;
if(tmp=="none" ||tmp == "NONE"){
    //需要找到合并开始点
}
else{
  flag  = false ; 
}
}

while( flag && i< cellsCount) {
   if(tr.childNodes[i].colSpan){
      tmp = tr.childNodes[i].colSpan;
  if(tmp>1){   
     if(i>col_ind){
       result = i -1 ;
   flag = false;
}
   }
}
i = i + 1;
}
if(flag){   
  result = cellsCount -1  ;
}
return result;
  };
 

//列合并
//@return  true =merged  success ;false = unmerged
  this._meregeCells = function(tr,col_ind,colspancount){   
    //alert('step 2');
    var tmp;
    var canMerge = this._canMergeCells(tr,col_ind,colspancount);
    if(!canMerge){
      //本次操作应该是取消合并
  //获得取消合并开始位置   
  var beginFindPos  = this._findBeginMergePos(tr,col_ind);
  //alert('tr.childNodes.length' +tr.childNodes.length)
  //获得取消合并结束位置
  var tt = (col_ind+colspancount -1 );
  var endFindPos  = this._findEndMergePos(tr,tt ,tr.childNodes.length);
 
  //alert('beginFindPos='+ beginFindPos +",endFindPos=" + endFindPos)
  for(var i=beginFindPos;i <= endFindPos && i< tr.childNodes.length ; i++){
     tr.childNodes[i].style.display = "";
if(tr.childNodes[i].colSpan){
       tr.childNodes[i].colSpan =1;
}

  }
  return false;
   }
  // alert('tr.childNodes.length---' )  
   //var k;   
   //alert('row col size=' + tr.childNodes.length +",col_ind + colspancount=" +(col_ind + colspancount))
   for (var i = col_ind; i < (col_ind + colspancount  ); i++){
    if(i == col_ind){
   tr.childNodes[col_ind].colSpan = colspancount ;
}else{  
   tr.childNodes[i].style.display = "none";
   //alert('remove')
}
  }
  return true;

}
}
分享到:
评论

相关推荐

    bootstrap表格列合并

    因此,要实现每四列合并,我们需要找到合适的时机插入具有合适`colspan`值的单元格。 以下是一种实现方法: 1. **创建基本表格结构**:首先,创建一个基础的Bootstrap表格,确保每个`&lt;tr&gt;`内有四个`&lt;td&gt;`。 ```...

    jasperreport列合并

    例如,可以设置单元格的`isColSpan`属性为`true`,并指定`colSpan`值来表示合并的列数。 2. **样式和样式表**:为了确保合并后的列样式正确,你需要在样式表(JRXML文件)中定义对应的样式。合并后的单元格可能需要...

    列表多行多列合并单元格

    例如,如果你的列表有三列,但某些情况下需要将第一列和第二列合并,那么可以先生成不合并的表格,然后根据合并规则找到需要合并的单元格,设置其`colspan`属性。 在实际应用中,可能还会遇到一些复杂情况,如: 1...

    Grid合并列

    8. **第三方库**:如EasyUI的`colspan`属性,或者使用Handsontable的`mergeCells`方法,都可以帮助实现列合并功能。 9. **自定义扩展**:如果现有的表格组件不满足需求,开发者可能需要编写自定义扩展或插件来实现...

    EasyUI指定列-合并相同数据行

    为了更好地理解和实现“EasyUI指定列-合并相同数据行”的功能,我们首先需要了解其实现的基本原理及具体步骤。 ##### 代码解析 ```javascript $('#coal_arrive').datagrid({ idField:'ID', toolbar:'#tb1', ...

    ext grid 合并行

    EXT Grid的行合并功能并不像列合并那样内置在默认配置中,因此需要通过一些额外的技巧来实现。以下是一个详细的步骤和知识点解析: 1. **理解EXT Grid的结构**:EXT Grid由一系列的行(Row)和列(Column)组成,每...

    table-rowspan表格自动合并单元格插件

    `colspan`与`rowspan`类似,但作用于列的跨度。合并单元格可以提高表格布局的复杂性和美感。 4. **动态操作**:此插件允许用户通过点击“添加”和“删除”按钮动态地操作表格。这涉及到DOM(Document Object Model...

    Extjs 合并单元格

    标题中的“Extjs 合并单元格”指的是在Ext JS框架下实现表格(Grid)中单元格的合并功能。Ext JS是一个强大的JavaScript库,专用于构建富客户端Web应用,其核心组件之一就是数据网格(Data Grid),用于展示大量结构...

    GridView中单元格合并

    在传统的表格布局中,每个单元格(cell)代表一行一列的交叉点,而合并单元格则是将多个相邻的单元格合并为一个大的单元格,这在显示分组数据、创建标题或者简化布局时特别有用。在GridView中,我们可以通过编程的...

    ExtJS GRID单元格合并

    在ExtJS 4.0版本中,Grid提供了单元格合并的功能,这在处理复杂数据展示时非常有用,比如汇总信息或者创建表头合并。下面我们将深入探讨如何在ExtJS 4.0 Grid中实现单元格合并,以及其背后的技术细节。 首先,理解...

    table合并单元格的多种方法

    在表格(Table)设计中,有时我们需要合并单元格来达到特定的展示效果,例如创建标题行或列,或者为了美观和布局对齐。在HTML、CSS以及JavaScript中,都有多种方式可以实现单元格的合并。这里我们将详细探讨六种合并...

    layui table合并单元格.zip

    layui提供了`colspan`和`rowspan`属性来设置单元格的跨越列数和行数,我们可以通过设置这两个属性来实现合并。 另外,"2layui数据表格跨行自动合并 - 合并行.url" 和 "3layui 动态表格之合并单元格 - 合并列.url" ...

    jQuery实现合并单元格功能

    合并单元格通常涉及到两个主要方面:行合并(rowspan)和列合并(colspan)。`rowspan`属性允许一个单元格跨多行显示,而`colspan`则可以让一个单元格跨多列显示。例如: ```html 合并两行 普通单元格 ...

    sql行转列合并GrideView单元格 实现类似Excel效果

    "sql行转列合并GrideView单元格 实现类似Excel效果"这个主题聚焦于如何利用SQL查询和前端技术来构建一个动态、灵活的数据展示界面,使得用户可以像操作Excel那样方便地查看和操作数据。以下是关于这一主题的详细知识...

    合并相同的单元格

    `colspan`定义了单元格横向合并的列数,而`rowspan`则定义了纵向合并的行数。例如: ```html &lt;td colspan="2"&gt;这是合并两列的单元格 这是合并两行的单元格 正常单元格 正常单元格 ``` 在这个...

    asp.net gridview 合并表头。合并列

    在ASP.NET中,GridView控件是用于展示数据的常用组件,尤其在网页上进行数据列表...不过,合并表头和列需要考虑多种因素,包括但不限于数据结构、样式设计和性能优化,确保在满足功能需求的同时保持良好的页面性能。

    【JavaScript源代码】Vue Elenent实现表格相同数据列合并.docx

    最后返回一个对象,包含需要合并的行数(`rowspan`)和列数(`colspan`): ```javascript methods: { flitterData4() { let spanOneArr = []; this.orderdata.forEach((item, index) =&gt; { if (index === 0) { ...

    Easyui指定列合并.rar_源码

    3. **DOM操作**:在表格渲染完成后,使用jQuery选择器找到需要合并的单元格,然后调整它们的`colspan`属性,使其跨越多个列。同时,需要隐藏或移除重复的单元格,以保持表格的结构。 4. **事件监听与更新**:为了...

    JS 实现Table相同行的单元格自动合并示例代码

    表格中的每个单元格可以跨越多个行或列,分别通过`rowSpan`和`colSpan`属性来设置。 在上述示例代码中,我们看到了一个自定义的JavaScript函数`autoRowSpan(tb, row, col)`,它接受三个参数:表格对象`tb`、起始行`...

    miniui datagrid 合并单元格

    2. **单元格合并的概念与应用场景**:单元格合并是指在同一列中将相邻的具有相同值的多个单元格合并为一个单元格的过程。 3. **McMergeCells函数的实现逻辑**:该函数是作者原创的一种高效合并单元格的方法,通过对...

Global site tag (gtag.js) - Google Analytics