有没有办法以百分比指定 ag-grid 列宽?
Is there a way to specify ag-grid column width in percentage?
现在,我看到指定列网格宽度的唯一方法是在列定义中添加宽度 属性,例如:
columnDefs: any[] = [
{
headerName: 'ID',
field: 'id',
width: 50,
type: 'numericColumn'
}
];
但是正如我们在下面的示例中看到的那样,网格的列没有占据屏幕显示的整个宽度。
https://stackblitz.com/edit/ag-grid-bss-test-nnojxg?file=app%2Fapp.component.ts
我希望能够设置每列的百分比宽度,但我找不到如何执行此操作。
使用 width: 10%
无效。
有什么解决方法吗?
不,默认情况下是不可能的。您只能以绝对数字设置宽度、minWidth 和 maxWidth。在 AgGrid 中使用动态宽度最简单的方法是使用 this.gridOptions.api.sizeColumnsToFit();
,因此它们为其单元格中的现有值采用最小宽度(根据 colDef 中指定的宽度)。
您可以尝试根据window-width手动计算width
(onInit),然后重新初始化AgGrid。但我不建议这样做,因为当用户调整 window 的大小时,您将需要再次计算(在 Window-Resize-HostListener 中)并重新初始化网格。 debounce-time 可能是可能的(所以当用户拖动他的浏览器角落时你不会每毫秒重新初始化),但它有点hacky并且最后你会得到很多非常难以调试的东西和难以维护的代码。
通过使用@Phil 建议的方法,我可以使用 gridReady
事件让网格采用可用的视口宽度:
在组件模板中:
<ag-grid-angular class="ag-theme-balham" [gridOptions]="gridOptions"
(gridReady)="onGridReady($event)">
</ag-grid-angular>
在组件打字稿文件中:
onGridReady(params) {
params.api.sizeColumnsToFit();
}
演示:
https://stackblitz.com/edit/ag-grid-bss-test-aejozx?file=app%2Fapp.component.html
我的解决方法是创建一个将数值从 rems 转换为像素的函数:
const remInPixel = parseFloat(getComputedStyle(document.documentElement).fontSize);
const convertRemToPixel = (rem) => rem * remInPixel;
然后在列定义的 width
属性 中使用它。
ag-grid
列定义的用法示例:
{
headerName: "Example",
field: "exampleField",
width: convertRemToPixel(3)
}
的确,这里没有太多秘密,只要你需要使用
您可以使用此函数的像素值。
我的解决方法是计算 AG-Grid 的父级 div 的宽度,并按百分比计算像素以分配给特定列。这是使用 jQuery 的解决方案:
function columnWidth(id, percentage){
var div = $("#" + id); // HTML ID of Grid
var parent = div.parent();
var width = parent.width() * percentage/100; // Pixel calculation
return width;
}
var colDefs = [
{
field: "name",
width: columnWidth("myGridId",25)
}
]
这对我来说效果很好。这是一个工作版本:stackblitz.com/edit/js-l1gmbf
我发现最好的方法是以像素为单位写下你的大概宽度,然后在 sizeColumnsToFit
上进行调整以使其响应(扩展和缩小浏览器宽度)并始终采用这个百分比宽度.
columnDefs: ColDef[] = [
{
headerName: 'User Name',
field: 'user',
width: 425, // <==== Play with this number until it is the approximate percentage width
},
// other column definitions
];
// onGridSizeChanged will get called when grid is ready and every time the grid's width changes
onGridSizeChanged(params: GridSizeChangedEvent) {
params.api.sizeColumnsToFit();
}
你的HTML可能看起来像
<ag-grid-angular
// your other bindings can go here
[columnDefs]="columnDefs"
(gridSizeChanged)="onGridSizeChanged($event)">
</ag-grid-angular>
我遇到了同样的问题。我删除了 this.gridApe.sizeColumnsToFit();
并在 def 列中使用了 flex property
。
例如,我有 3 列; ID,名称,删除。我需要让列 'Name' 占用最多 space。所以,columnDef
将是:
columnDefs: ColDef[] = [
{
headerName: "#id", field: 'id',
filter: true,
flex: 1
},
{
headerName: "Name", field: 'name',
flex: 3
},
{
headerName: 'Delete', field: "delete",
flex: 1
},
];
所以,列名占最大space,table宽度占父级宽度
现在,我看到指定列网格宽度的唯一方法是在列定义中添加宽度 属性,例如:
columnDefs: any[] = [
{
headerName: 'ID',
field: 'id',
width: 50,
type: 'numericColumn'
}
];
但是正如我们在下面的示例中看到的那样,网格的列没有占据屏幕显示的整个宽度。
https://stackblitz.com/edit/ag-grid-bss-test-nnojxg?file=app%2Fapp.component.ts
我希望能够设置每列的百分比宽度,但我找不到如何执行此操作。
使用 width: 10%
无效。
有什么解决方法吗?
不,默认情况下是不可能的。您只能以绝对数字设置宽度、minWidth 和 maxWidth。在 AgGrid 中使用动态宽度最简单的方法是使用 this.gridOptions.api.sizeColumnsToFit();
,因此它们为其单元格中的现有值采用最小宽度(根据 colDef 中指定的宽度)。
您可以尝试根据window-width手动计算width
(onInit),然后重新初始化AgGrid。但我不建议这样做,因为当用户调整 window 的大小时,您将需要再次计算(在 Window-Resize-HostListener 中)并重新初始化网格。 debounce-time 可能是可能的(所以当用户拖动他的浏览器角落时你不会每毫秒重新初始化),但它有点hacky并且最后你会得到很多非常难以调试的东西和难以维护的代码。
通过使用@Phil 建议的方法,我可以使用 gridReady
事件让网格采用可用的视口宽度:
在组件模板中:
<ag-grid-angular class="ag-theme-balham" [gridOptions]="gridOptions"
(gridReady)="onGridReady($event)">
</ag-grid-angular>
在组件打字稿文件中:
onGridReady(params) {
params.api.sizeColumnsToFit();
}
演示:
https://stackblitz.com/edit/ag-grid-bss-test-aejozx?file=app%2Fapp.component.html
我的解决方法是创建一个将数值从 rems 转换为像素的函数:
const remInPixel = parseFloat(getComputedStyle(document.documentElement).fontSize);
const convertRemToPixel = (rem) => rem * remInPixel;
然后在列定义的 width
属性 中使用它。
ag-grid
列定义的用法示例:
{
headerName: "Example",
field: "exampleField",
width: convertRemToPixel(3)
}
的确,这里没有太多秘密,只要你需要使用 您可以使用此函数的像素值。
我的解决方法是计算 AG-Grid 的父级 div 的宽度,并按百分比计算像素以分配给特定列。这是使用 jQuery 的解决方案:
function columnWidth(id, percentage){
var div = $("#" + id); // HTML ID of Grid
var parent = div.parent();
var width = parent.width() * percentage/100; // Pixel calculation
return width;
}
var colDefs = [
{
field: "name",
width: columnWidth("myGridId",25)
}
]
这对我来说效果很好。这是一个工作版本:stackblitz.com/edit/js-l1gmbf
我发现最好的方法是以像素为单位写下你的大概宽度,然后在 sizeColumnsToFit
上进行调整以使其响应(扩展和缩小浏览器宽度)并始终采用这个百分比宽度.
columnDefs: ColDef[] = [
{
headerName: 'User Name',
field: 'user',
width: 425, // <==== Play with this number until it is the approximate percentage width
},
// other column definitions
];
// onGridSizeChanged will get called when grid is ready and every time the grid's width changes
onGridSizeChanged(params: GridSizeChangedEvent) {
params.api.sizeColumnsToFit();
}
你的HTML可能看起来像
<ag-grid-angular
// your other bindings can go here
[columnDefs]="columnDefs"
(gridSizeChanged)="onGridSizeChanged($event)">
</ag-grid-angular>
我遇到了同样的问题。我删除了 this.gridApe.sizeColumnsToFit();
并在 def 列中使用了 flex property
。
例如,我有 3 列; ID,名称,删除。我需要让列 'Name' 占用最多 space。所以,columnDef
将是:
columnDefs: ColDef[] = [
{
headerName: "#id", field: 'id',
filter: true,
flex: 1
},
{
headerName: "Name", field: 'name',
flex: 3
},
{
headerName: 'Delete', field: "delete",
flex: 1
},
];
所以,列名占最大space,table宽度占父级宽度