我正在使用 SlickGrid 并努力寻找解决以下问题的优雅解决方案:
- 所有列在首次呈现时都必须具有特定的初始宽度,但之后可以调整大小
- 调整窗口大小时,最后一列应自动填充剩余的列空间
我见过:
Make one column fill remaining space in SlickGrid without messing up explicit width columns
resizing of grid when resizing browser window
How do I autosize the column in SlickGrid?
但这些似乎并不能完全满足我的需要。 如果我使用forceFitColumns选项,那么所有列都将自动调整大小(除非我在它们上设置了maxsize)。 在 window.resize 上使用 resizeCanvas 效果很好 - 但只有在 forceFitColumns 为 true 时它仍然有效。
如果我设置 minWidth=maxWidth
- 那么我无法调整列的大小。
有什么建议吗?
最佳答案
我不确定它会解决您的所有问题,但就我而言,我确实使用了 forceFitColumns
,然后根据我希望我的列在大小上如何 react ,我将使用 的组合>minWidth
和 width
,在某些情况下,那些永远不会超过特定宽度的宽度,我也会使用 maxWidth
。现在您遇到的问题是,当将 minWidth
设置为与 maxWidth
相同时,这当然会使其无法调整大小,请考虑一下您设置的最小值和最大值,SlickGrid 尊重它,现在能够在事后调整它的大小。我还有我的网格,它占据了屏幕 95% 的宽度,所以我在侧面有一些填充,并且我使用 jQuery 自动调整大小。
这是我的代码:
// HTML Grid Container
<div id="myGridContainer" style="width:95%;">
<div class="grid-header" style="width:100%">
<label>ECO: Log / Slickgrid</label>
<span style="float:right" class="ui-icon ui-icon-search" title="Toggle search panel" onclick="toggleFilterRow1()"></span>
</div>
<div id="myGrid" style="width:100%;height:600px;"></div>
<div id="myPager"></div>
</div>
// My SlickGrid Options
var options = {
enableCellNavigation: true,
forceFitColumns: true
};
// The browser auto-resize
$(window).resize(function () {
$("#myGrid").width($("myGridContainer").width());
$(".slick-viewport").width($("#myGrid").width());
grid.resizeCanvas();
});
编辑
我还对以下事实感到恼火:将所有这些一起使用会阻止您调整列的宽度。很久之后,我想出了一个不同的解决方案,它使字段扩展(采用可用宽度)并且不会阻止您调整宽度大小。因此,我相信这个新的解决方案能够为您提供您正在寻找的东西...首先删除 maxWidth
属性,仅使用 minWidth
和 width
code>,实际上,如果您愿意,您可能可以只使用 width
。不幸的是,现在我不得不使用以下代码修改核心文件 1 个 slick.grid.js
:
//-- slick.grid.js --//
// on line 69 insert this code
autoExpandColumns: false,
// on line 1614 PREVIOUS CODE
if (options.forceFitColumns) {
autosizeColumns();
}
// on line 1614 change to this NEW CODE
if (options.forceFitColumns || options.autoExpandColumns) {
autosizeColumns();
}
然后回到我的网格定义,我用以下内容替换以前的选项:
// My NEW SlickGrid Options
var options = {
enableCellNavigation: true,
forceFitColumns: false, // make sure the force fit is false
autoExpandColumns: true // <-- our new property is now usable
};
通过这个新的更改,它具有一些强制配合(扩展)的功能,但不会像强制配合那样限制您随后调整列宽大小。我还使用 columnPicker 对其进行了测试,如果您隐藏一列,它会相应地调整其他列的大小。我还修改了文件 slick.columnpicker.js
以包含该属性的复选框,但这完全是可选的...如果你们中的任何人也需要的话,我也可以添加该代码。瞧! :)
编辑#2
很久以后我意识到不需要修改核心文件,我们可以在网格创建后简单地调用grid.autosizeColumns()
。像这样
var options = { forceFitColumns: false };
grid = new Slick.Grid("#myGrid", data, columns, options);
// will take available space only on first load
grid.autosizeColumns();
这将在首次加载时自动调整列的大小以适合屏幕,但不会给您带来 forceFitcolumns
标志的限制。
关于Slickgrid:最终列自动调整大小以使用所有剩余空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17360367/