4

我正在使用 SlickGrid 并努力为以下问题找到一个优雅的解决方案:

  1. 所有列在第一次渲染时必须具有特定的初始宽度,但之后可以调整大小
  2. 调整窗口大小时,最后一列应自动填充剩余的列空间

我见过:


在调整浏览器窗口大小时, 使一列填充 SlickGrid 中的剩余空间而不会弄乱网格的显式宽度列
如何调整 SlickGrid 中的列大小?

但这些似乎并不能完全满足我的需要。如果我使用 forceFitColumns 选项,那么所有列都会自动调整大小(除非我在它们上设置了 maxsize)。在 window.resize 上使用 resizeCanvas 效果很好 - 但它仍然只有在 forceFitColumns 为真时才有效。

如果我设置minWidth=maxWidth- 那么我无法调整列的大小。

有什么建议么?

4

2 回答 2

6

我不确定它会纠正你的所有问题,但在我的情况下,我确实使用了forceFitColumns,然后根据我希望我的列在大小上的反应,我将使用 and 的组合minWidthwidth在某些情况下,那些永远不会超过 a一定宽度,然后我也会使用 a maxWidth。现在您遇到的问题是,当将 设置为与 this 相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属性并仅使用minWidthand width,实际上您可能只使用 thewidth如果您想要的话。不幸的是,现在我不得不slick.grid.js用以下代码修改核心文件的 1 个:

//-- 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标志的限制。

于 2013-06-28T22:13:42.030 回答
1

我知道这个回复有点晚了。

但我设法做到了这一点,而无需在 slick.grid.js 上进行更改或在 columns 数组中设置 min/maxWidth 。

相反,我所做的是遍历列数组,添加每列的“宽度”字段的值,然后我做了一个简单的数学计算,将最后一列宽度设置为 innerWidth - totalColumsWidth + lastColumnWidth。

代码:

function lastColumnWidth(columns)
{
        var widthSum = 0;
        angular.forEach(columns, function(col) {
            if(col.width) { widthSum = col.width + widthSum; }
        });
        if(window.innerWidth > widthSum) {
            columns[columns.length-1].width = columns[columns.length-1].width + (window.innerWidth - widthSum);
        }
        return columns;
}
于 2017-04-04T20:52:45.807 回答