我想根据内容大小提供可变的行高。可以在 Slickgrid 中使用吗?
你能指出我的任何例子吗?
这是可能的,但它不是微不足道的,您可能会受到性能损失。SlickGrid 的工作方式,它需要能够快速回答以下两个问题:
当您使用静态行高时,回答这些问题是微不足道的;但是,使用动态行高,您需要维护一些额外的数据结构。
这大致是我在 Slick.Grid.js 中所做的更改
为了使这个实用(高性能),您还需要一个行顶偏移缓存(一个行大小总和的缓存)。这将使第一个问题的快速计算成为可能,并允许二分搜索回答第二个问题。
我希望这会有所帮助。
在@Stephen Robinson 的回答的帮助下,我已经在我的项目中实现了这一点。
如果有人感兴趣,可以查看:
https ://github.com/vihari/Seaview/blob/version3.0/SlickGrid-master/slick.grid.js 。
如果您将 options.enableWrap 设置为 true,则可以使用上面的文件启用它。
谢谢你。
我知道这不符合问题的核心,但现在决定了一个简单的解决方案,它是最小的努力并且满足我目前的要求。所以,这只是以防其他人也在寻找一个简单的解决方案。
我从一个输入框开始,更改值会调整行的大小。但是,我现在决定使用滑块。事实上,由于我的网格中的数据如此之少(保证是少量数据,并且行数很少),我会随着滑块的滑动动态调整网格的大小。现在,我知道很多人会说这是一个糟糕的主意,因为它可能非常慢,但同样,我使用的数据量非常少。
关键是我使用选项中设置的新 rowHeight 值再次重新创建网格。
添加代码以处理滑块并重新创建网格(或者,如果您不想在每个滑动刻度上重绘,您可以将我在“滑动”功能中的内容移动到“停止”功能):
$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 的网格选项。然后,创建(或重新创建)网格。
简单明了,这在 SlickGrid 中不受支持,并且可能永远不会支持。对不起。
github上还有JLynch7的可变高度实现:
https://github.com/JLynch7/SlickGrid/tree/variableRowHeight
据我了解,高度是由用户设置的,而不是根据行单元格的内容自动计算的(我只查看了 example/example-variable-row-height-dataview.html)
作为上述选项的总结,它们都不是官方的、受支持的和生产就绪的。甚至 doby-grid 选项(更受支持)仍被列为未准备好生产。
请注意,两者之间也存在差异:
令人惊讶的是,对于上面的所有 SlickGrid 变体(以及许多其他 DataGrid 库),您可能会得到上述的一两个,但不是全部三个。
如果您不太关心官方、支持和生产就绪,那么这是我测试上面列出的 3 个 SlickGrid 变体的印象:
海景
林奇7
多比网格
我最近派生了 SlickGrid 以添加一系列新功能 - 包括可变(和可调整大小)行。你可以在这里试试:https ://github.com/globexdesigns/doby-grid
由于 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 美元。
在外面定义这个变量......
变量表高度 = 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();
});
对于 Vihari Piratla 的解决方案 - 我已经下载了 Seaview,修改了它的 /SlickGrid-master/examples/example1-simple.html 以添加新选项 enableWrap - 在我的测试期间,当 enableWrap 设置时,example1-simple.html 继续按预期工作为 false,但当其设置为 true 时,网格被绘制为空且没有内容。我想知道是否有特殊的方式使用 enableWrap 选项?