在 ag-Grid 中的列标题上添加自定义下拉菜单

Posted

技术标签:

【中文标题】在 ag-Grid 中的列标题上添加自定义下拉菜单【英文标题】:Adding custom drodpdown on column Header in ag-Grid 【发布时间】:2021-01-11 12:19:12 【问题描述】:

我正在尝试在具有UI elements as below (containing some input type text and buttons and unordered list) 的列标题上创建一个自定义下拉列表,并且此下拉列表应将其中的列定义列表作为列表获取。 有没有办法实现这一点,在 ag-Grid 的列标题上创建自定义下拉 div。点击时如何在列标题上获得点击事件?

https://www.ag-grid.com/javascript-grid-column-menu/

这是plunker链接:-

https://plnkr.co/edit/hztm3jf5FDBK2unX

.jsx:-

<AgGridReact
  columnDefs=this.state.columnDefs
  defaultColDef=this.state.defaultColDef
  rowData=this.state.rowData
  // frameworkComponents=this.state.frameworkComponents
  onGridReady=this.onGridReady            
/>

【问题讨论】:

【参考方案1】:

您可以使用getMainMenuItems 回调自定义列菜单内容。下面的示例演示了如何在generalMenuTab 中添加用户提供的列设置列表。您还可以在此处使用GridApi.setColumnDefs() 更新某些列设置的值并立即查看结果。

getMainMenuItems = (params: GetMainMenuItemsParams) => 
  const  api, columnApi  = params;
  const menuItems = [] as MenuItemDef[];
  const colDef = params.column.getColDef();
  const userProvidedColDefKeys = Object.keys(colDef);

  userProvidedColDefKeys.forEach((key) => 
    const value = colDef[key];
    const menuItem: MenuItemDef =  name: key ;
    const updateColDef = (key: string, value: any) => 
      const colDefs = api?.getColumnDefs();
      const newColDefs = colDefs?.map((c) => 
        const newColDef = ;

        Object.keys(c).forEach((key) => 
          if (userProvidedColDefKeys.includes(key)) 
            newColDef[key] = c[key];
          
        );
        if (c.field === colDef.field) 
          newColDef[key] = value;
        
        return newColDef;
      );
      api?.setColumnDefs(newColDefs);
    ;

    if (typeof value === "boolean") 
      menuItem.subMenu = [
        
          name: "Yes",
          checked: value,
          action: () => updateColDef(key, true)
        ,
        
          name: "No",
          checked: !value,
          action: () => updateColDef(key, false)
        
      ];
     else if (typeof value === "number") 
      if (key === "flex") 
        menuItem.subMenu = [0, 1, 2, 3, 4].map((flex) => (
          name: flex.toString(),
          checked: flex === value,
          action: () => updateColDef(key, flex)
        ));
       else if (
        key === "width" ||
        key === "minWidth" ||
        key === "maxWidth"
      ) 
        menuItem.subMenu = [50, 100, 200, 300, 500].map((width) => (
          name: width.toString(),
          checked: width === value,
          action: () => updateColDef(key, width)
        ));
      
    

    menuItems.push(menuItem);
  );

  return menuItems;
;

用法

<AgGridReact
  getMainMenuItems=this.getMainMenuItems
  ...
/>

现场演示

【讨论】:

感谢@NearHuscarl。如上 UI 包含一个 input type='text' 作为下拉列表的一部分。我们能否将其添加为 UI 的一部分,以及与 columnsMenuTab 相同的复选框作为下拉列表的一部分。 不,除非您完全覆盖整个标题组件并从头开始编写自己的列菜单,否则您不能。我能想到的一种解决方法是打开一个带有输入字段的对话框,以在用户单击菜单时更新值。 @Mahi 好的。您能帮我实现 UI 部分并在该下拉 div 中获取相应的列标题 columnDef 和“gridApi”和“gridColumnApi”数据吗? @Mahi 你能详细说明一下吗?我的答案中的列菜单已经可以显示您在gridOptions 中提供的所有colDef 属性。还是要显示所有 colDef 属性(包括您未指定的属性)?

以上是关于在 ag-Grid 中的列标题上添加自定义下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

上下文菜单导出中的 ag-grid 企业自定义页脚 excel 和 CSV

ag-grid:在列值上创建过滤器下拉列表?

(ag-grid)动画动态添加的列

MFC 在自定义工具栏上添加有下拉菜单的按钮。

Android自定义下拉/弹出菜单

Ag-Grid 在与下拉列表交互期间保持自定义过滤器打开