如何使用 ExtJS Grid 4.1 制作具有行/列跨度的类表结构

Posted

技术标签:

【中文标题】如何使用 ExtJS Grid 4.1 制作具有行/列跨度的类表结构【英文标题】:How to make a table-like structure with row/colspans using ExtJS Grid 4.1 【发布时间】:2016-01-20 17:33:18 【问题描述】:

我需要使用具有 colspan 和 rowspan 功能的 ExtJS 4.1 网格来实现一个逻辑。

【问题讨论】:

您的标题不是特别具有描述性,因此我已对其进行了修改 - 请随时进一步修改,以描述您想要做什么。此外,如果您可以展示您尝试过的内容,那将有很大帮助。目前,您似乎已经为您的整个项目提出了要求,人们肯定不会为您这样做。如果您可以修改您的问题以包含可能的最小问题,一旦解决,您就可以完成剩下的工作,那将是理想的。 【参考方案1】:

解决方案一:ExtJS Grid with rowSpan/colSpan

如果你使用普通的 ExtJS 网格,每个参数值一行,你可以(ab)以某种方式使用渲染器:

renderer:function(value, meta, record, rowIndex, colIndex, store, view) 
    var columnManager = view.ownerCt.getColumnManager(),
        previousRecord = store.getAt(rowIndex-1),
        nextRecord = store.getAt(rowIndex+1),
        column = columnManager.getHeaderAtIndex(colIndex),
        previousColumn = columnManager.getHeaderAtIndex(colIndex-1),
        nextColumn = columnManager.getHeaderAtIndex(colIndex+1),
        cellAbove = view.getCell(previousRecord,column),
        cellBelow = view.getCell(nextRecord,column),
        cellLeft = view.getCell(record, previousColumn),
        cellRight = view.getCell(record, nextColumn);
    ...
    if(someCondition) 
        meta.tdAttr='rowSpan=4';
     else if (someOtherCondition /* any of the previous three records has someCondition */) 
        meta.tdStyle='display:none';
    
    return value; // Don't forget this, or else your cell is empty!
`

以类似的方式,我曾经实现了一个渲染器,它可以合并具有相同内容的相邻单元格,因为我不得不替换 MSFlexGrid with MergeCells=flexMergeFree

我知道的四个缺点:

您必须始终为 colSpan 和 rowSpan 获得正确的 display:none 数量。 您不能轻松地将它与特殊列(numbercolumns、datecolumns、checkcolumns)一起使用,因为您覆盖了它们的正常渲染器。 您的数据必须采用“带有原始值的记录”形式,因此当您加载商店时,您必须遍历树并生成记录。 将不再在 ExtJS6 中工作;不确定 ExtJS 5。

解决方案二:嵌套网格

您可以轻松render a grid into a grid's RowExpander plugin。

plugins: [
    ptype: "rowexpander",
    rowBodyTpl: ['<div id="SessionInstructionGridRow-ClientSessionId" ></div>']
    listeners:
        expandbody:function() 
            var targetId = 'SessionInstructionGridRow-' + record.get('ClientSessionId');
            if (Ext.getCmp(targetId + "_grid") == null) 
                var sessionInstructionGrid = Ext.create('TS.view.client.SessionInstruction', 
                    renderTo: targetId,
                    id: targetId + "_grid"
                );
                rowNode.grid = sessionInstructionGrid;
                sessionInstructionGrid.getEl().swallowEvent(['mouseover', 'mousedown', 'click', 'dblclick', 'onRowFocus']);
                sessionInstructionGrid.fireEvent("bind", sessionInstructionGrid,  ClientSessionId: record.get('ClientSessionId') );
            
        
    
],

主要缺点是它看起来确实像网格中的网格,而不是带有 rowSpan 和 colSpan 的单个网格;因此它与您的屏幕截图相去甚远。但这就是我今天如何实现包含数组的字段内容的显示。如果您想显示结构化数据(对象),也可以将 propertygrid 渲染到 rowExpander。

【讨论】:

我还需要给定问题的逻辑/解决方案

以上是关于如何使用 ExtJS Grid 4.1 制作具有行/列跨度的类表结构的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ExtJS 4.1 中禁用网格中的某些行

ExtJS 4.1 中的分页问题

ExtJS 4.1 如何更改网格面板标题高度

ExtJs 4.1 网格的分组功能启用和禁用问题

EXTJS4.2——4.1Grid添加按钮控件

ExtJS 4.1:模态窗口似乎在提交窗口之前返回控制