在 SlickGrid 中是不是可以使用可变行高?

Posted

技术标签:

【中文标题】在 SlickGrid 中是不是可以使用可变行高?【英文标题】:Is variable rowheight a possibility in SlickGrid?在 SlickGrid 中是否可以使用可变行高? 【发布时间】:2011-02-17 19:19:47 【问题描述】:

我想根据内容大小提供可变的行高。可以在 Slickgrid 中使用吗?

你能举出一些例子吗?

【问题讨论】:

Can SlickGrid's row height be dynamically altered? 的可能重复项 【参考方案1】:

简单明了,这在 SlickGrid 中不受支持,并且可能永远不会支持。对不起。

【讨论】:

谈务实。 LOL @Stephen 自定义解决方案似乎可行。我现在会继续使用 Google 搜索和 ***ing。 我已经用一些自定义代码解决了这个here。 - 不需要对 slickgrid 代码进行 hack ;)【参考方案2】:

这是可能的,但它不是微不足道的,您可能会受到性能损失。 SlickGrid 的工作方式,需要能够快速回答以下两个问题:

对于给定的 X 行,该行的顶部偏移量是多少? 对于给定的偏移量 Y,在该偏移量处是哪一行?

当您使用静态行高时,回答这些问题是微不足道的;但是,对于动态行高,您需要维护一些额外的数据结构。

这大致是我在 Slick.Grid.js 中所做的更改

添加一个新数组来跟踪行大小。将所有行初始化为默认大小 删除createCssRules中设置单元格高度的css规则 在 renderRows 末尾添加一些代码,检查行中每个单元格的渲染高度,然后将所有单元格的高度设置为最大值(并将高度存储在行大小数组中)。您还需要根据当前行上方的行高总和来调整顶部偏移量。 在渲染末尾添加代码,将画布的大小调整为所有行高的总和。 更新 getViewport 以根据行高总和返回顶部和底部行。 还有一些使用 options.rowHeight 的其他地方。您可以忽略其中的一些,但至少在调整画布大小的任何地方都需要更改。

为了实现这一点(高性能),您还需要一个行顶偏移缓存(一个行大小总和的缓存)。这样可以快速计算第一个问题,并允许二分搜索回答第二个问题。

希望对你有帮助。

【讨论】:

通过此实现,您对渲染基准产生了什么样的性能影响? 有机会看到你实现这个的 github 要点吗?【参考方案3】:

我知道这不符合问题的核心,但现在决定了一个简单的解决方案,该解决方案省力且满足我目前的要求。所以,这只是以防其他人也在寻找简单的解决方案。

我从一个输入框开始,更改值会调整行的大小。但是,我现在决定使用滑块。事实上,由于我的网格中的数据如此之少(保证是少量数据,并且行数很少),我会随着滑块的滑动动态调整网格的大小。现在,我知道很多人会说这是一个糟糕的主意,因为它可能非常慢,但是我再次使用了非常少量的数据。

关键是我再次使用选项中设置的新 rowHeight 值重新创建网格。

    包括 jQuery UI: 为滑块和值创建元素 确保在页面加载时设置和初始化网格。

    添加代码以处理滑块并重新创建网格(或者,如果您不想在每个滑动刻度上重绘,您可以将我在“滑动”功能中的内容移动到“停止”功能):

    $j( "#resizeRowSlider" ).slider(
          range:"min"
        , min: 50
        , max: 200
        , value: 50
        , create: function( even, ui ) 
            $j("rowResizeValue").html( "50" );
        
        , slide: function( event, ui ) 
            $j( "rowResizeValue" ).html( ui.value );
    
            options.rowHeight = ui.value;
    
            // I do a manual resize; you could use autoHeight:true in grid options
            resizeGrid();
    
            grid = new Slick.Grid("#" + gridElemId, json, columns , options);
            grid.setSelectionModel(new Slick.RowSelectionModel() );
    
            refreshGrid(); // Handle invalidate, resizeCanvas
        
        , stop: function( event, ui ) 
        
    );
    

另外,我应该注意,这不是以每行为基础的,但同样,它现在符合我的需求。这并不理想,但它有效。此外,如果您确实需要第一次渲染网格而没有任何溢出,您可以在获得相关文本时创建一个隐藏的 div 并添加display:table-cell,然后获取 div 高度并将该值设置为 rowHeight 的网格选项.然后,创建(或重新创建)网格。

【讨论】:

【参考方案4】:

在@Stephen Robinson 在这里的回答的帮助下,我已经在我的项目中实现了这一点。 如果有人感兴趣,可以查看:https://github.com/vihari/Seaview/blob/version3.0/SlickGrid-master/slick.grid.js. 如果您将 options.enableWrap 设置为 true,则可以使用上面的文件启用它。 谢谢。

【讨论】:

【参考方案5】:

对于 Vihari Piratla 的解决方案 - 我已经下载了 Seaview,修改了它的 /SlickGrid-master/examples/example1-simple.html 以添加新选项 enableWrap - 在我的测试期间,example1-simple.html 继续按预期工作enableWrap 设置为 false,但当其设置为 true 时,网格被绘制为空且没有内容。我想知道是否有特殊的方式使用 enableWrap 选项?

【讨论】:

Seaview的3.0版分支,希望你用的是这个。 感谢您这么快回来!我试过 3.0 分支,但它也给了我空白网格。我试图修复 slick.grid.js 代码中的一些地方,例如data.getLength() 和 getDataLengh(),data.getItem() 和 getDataItem().. 之后内容被绘制到大约 30+ 行(如果我可以定义在 init 时预加载多少就可以了),但是编辑单元格不再起作用..我不确定我所做的更改是否正确.. 我不确定您是否可以编辑单元格,因为我没有为此烦恼。这应该是观察到的行为:一旦加载应该显示所有行(分页可能不起作用)。为了使其成为 O(constant),行高仅在向下滚动时计算和添加,因此分页可能不起作用。【参考方案6】:

github上还有JLynch7的可变高度实现:

https://github.com/JLynch7/SlickGrid/tree/variableRowHeight

据我了解,高度是由用户设置的,不会根据行单元格的内容自动计算(我只查看了 example/example-variable-row-height-dataview.html)

【讨论】:

【参考方案7】:

我最近分叉了 SlickGrid 以添加一系列新功能 - 包括可变(和可调整大小)行。你可以在这里试试:https://github.com/globexdesigns/doby-grid

【讨论】:

【参考方案8】:

在外面定义这个变量....

var tableHeight = 0;

在创建光滑网格之前,请使用以下行:

// 每行 30 像素,这将覆盖标题...您可以为您的表格调整此值。

tableHeight = dataTable.length * 30;    

if(tableHeight >  ($(window).height() - 400))
       $("#myGrid").height($(window).height() - 400);
else
       $("#myGrid").height(tableHeight);

如果用户在页面已经生成时改变屏幕,下面将根据屏幕和数据行数调整表格的大小:

    $(window).resize(function() 

    // For grid height
    if(tableHeight >  ($(window).height() - 400))
        $("#myGrid").height($(window).height() - 400);
    else
        $("#myGrid").height(tableHeight);
    

    // For grid width
    $("#myGrid").width("100%");

    // Resize the grid dynamically. 
    gridName.resizeCanvas();
);

【讨论】:

【参考方案9】:

作为上述选项的总结,它们都不是官方的、受支持的和生产就绪的。甚至 doby-grid 选项(更受支持)仍然列为未准备好生产。

注意,也有区别:

可以为每行单独更改行高。 文本可以换行到下一行。 行高可以自动调整以适应内容。

令人惊讶的是,对于上面的所有 SlickGrid 变体(以及许多其他 DataGrid 库),您可能会得到上述的一两个,但不是全部三个。

如果您不太关心官方、支持和生产就绪,那么这是我测试上面列出的 3 个 SlickGrid 变体的印象:

海景

用户报告仅显示白色的问题,未经编辑单元格测试(警告),分页可能不起作用(警告)。 我对演示的测试发现,它可以包装文本并自动改变单元格高度,但有一个错误,即行/边框偏离了几个像素。所以可能可用,但尚未准备好生产。 我尝试下载并使用它。它在单元格中包含文本 - 很好。 它对单元格高度的自动调整非常破碎/不完整,这使得文本的换行实际上毫无用处(除非您修复了行高 - 不是很好)。 我已经部分修复了单元格高度的自动调整,但还有很多工作要做。不是一个简单的任务。不能开箱即用。绝对没有准备好生产。

JLynch7

没有下载就无法运行演示。 我尝试下载并使用它。它有问题(我必须对其进行修复才能使其正常工作),添加可变行高,但似乎不会包裹文本,也不会根据文本自动调整行高!。它没有被积极维护。而且不是很受欢迎,所以支持得不是很好。 Seaview 似乎更高级,尽管它的“自动调整行高”功能被破坏了。

doby-grid

处于 alpha 阶段 - 尚未准备好生产。似乎是一个相当大的分支 - 有很多变化。 我试过了。入门是令人困惑的,但它的工作。需要 bowser 和 Require JS。 options.resizableRows 是我们想要的一半 - 您可以手动动态更改行高。但是没有自动调整行高的大小以适应内容!??!! This issue 声明“添加真正动态的行高(受行内容影响)将需要我们禁用很多功能。”。 他们提供了几种可能的解决方案,但一位坚定的开发人员尝试了这一点,但遇到了很多麻烦。他可能已经成功了,或者他可能已经放弃了。我不会冒险的。

【讨论】:

这是现在主仓库的插件:www.slickgrid.net【参考方案10】:

由于 SlickGrid 的分支在许多方面都不是真正可行的选择,我认为这篇文章的许多读者讨论 SlickGrid 的替代方案会很有价值。

我认为完全支持可变行高的“可行替代方案”是:每行可以有不同的行高,自动适应内容,并让文本换行到下一行。

我对此进行了相当广泛的研究,但不幸的是,我还没有找到与 SlickGrid 相关的可行替代方案。 在其他替代方案中,我只找到了一个可免费用于商业用途的 - dojox DataGrid,但目前尚不清楚如何使用自定义编辑器(大多数商业版本都提供此功能)。

有很多可行的替代方案需要付费才能用于商业用途:dhtmlxGrid、jQuery EasyUI DataGrid、jQWidgets、Wijmo Grid 小部件、JideTable 和 Sencha ExtJS Grids。其中,我个人认为最好的是 dhtmlxGrid http://dhtmlx.com/docs/products/dhtmlxGrid/ - 免费版是 GPL,专业版是 199 美元。

【讨论】:

以上是关于在 SlickGrid 中是不是可以使用可变行高?的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 中使用自动布局进行动态单元格布局和可变行高

在 UITableView 中使用自动布局进行动态单元格布局和可变行高

SlickGrid:使用 DataView 而不是原始数据的简单示例?

JTree:可变行高

如何在 Slickgrid 的顶部添加新行?

SlickGrid 没有 renderComplete 事件。是不是有一个事件会在所有渲染完成后触发