有没有办法以百分比指定ag-grid列宽?

时间:2018-05-14 18:29:48

标签: angular ag-grid percentage column-width

现在,我看到指定列网格宽度的唯一方法是向列定义添加width属性,如:

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%无效。

有没有解决方法呢?

5 个答案:

答案 0 :(得分:4)

不,默认情况下不可能。您只能以绝对数字设置width,minWidth和maxWidth。在AgGrid中使用动态宽度最简单的方法是使用this.gridOptions.api.sizeColumnsToFit();,因此它们将最小宽度(根据colDef中的指定宽度)用于其单元格中的现有值。

您可以尝试根据窗口宽度手动计算width(onInit),然后重新初始化AgGrid。但我不建议这样做,因为当用户调整窗口大小时,您需要再次计算(在Window-Resize-HostListener中)并重新初始化网格。去抖动时间可能是有可能的(所以当用户拖动他的浏览器角落时你不会每毫秒重新初始化),但它有点hacky,最终你会得到很多非常难的-debug和难以维护的代码。

答案 1 :(得分:4)

通过使用@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

答案 2 :(得分:2)

我的解决方法是创建一个将数值从rems转换为像素的函数:

const remInPixel = parseFloat(getComputedStyle(document.documentElement).fontSize);

const convertRemToPixel = (rem) => rem * remInPixel;

然后在列定义的width属性中使用它。

答案 3 :(得分:0)

我的解决方法是计算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)
       } 
]

这对我来说很好。

答案 4 :(得分:0)

我发现最好的方法是以像素为单位写出大约的宽度,然后靠sizeColumnsToFit使其响应(扩大和缩小浏览器宽度),并始终采用此百分比宽度。 / p>

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>