GroupDataGrid 组件

基本用法

首先,请 安装扩展组件,然后通过 Studio 视图设计器Add Component 工具箱添加该组件。

groupdatagrid palette

下面的例子中,用户按 Grade 列进行了分组:

groupdatagrid basic
XML 代码
<view xmlns="http://jmix.io/schema/flowui/view" xmlns:groupg="http://jmix.io/schema/groupgrid/ui"
      title="msg://basicGroupGridView.title"> (1)
    <data>
        <collection id="customersDc"
                    class="com.company.groupdatagridex1.entity.Customer"
                    fetchPlan="_base">
            <loader id="customersDl">
                <query>
                    <![CDATA[select e from Customer e]]>
                </query>
            </loader>
        </collection>
    </data>
    <facets>
        <dataLoadCoordinator auto="true"/>
    </facets>
    <layout>
        <groupg:groupDataGrid id="customersGroupDataGrid"
                              dataContainer="customersDc"
                              minWidth="100px"
                              width="100%">
            <groupg:groupBy>
                <groupg:columnRef key="grade"/> (2)
            </groupg:groupBy>
            <groupg:columns>
                <groupg:groupColumn header="Grade"/> (3)
                <groupg:column property="firstName"/>
                <groupg:column property="lastName"/>
                <groupg:column property="email"/>
                <groupg:column property="country"/>
                <groupg:column property="grade"/>
            </groupg:columns>
        </groupg:groupDataGrid>
    </layout>
</view>
1 如果组件是手动添加而不是通过 Add Component 工具箱添加,则需要声明 groupg 命名空间。
2 表格初始化是通过 grade 属性分组;也可以添加更多的分组配置。
3 添加分组列。

数据绑定

数据绑定是指将组件与数据容器进行关联。将组件绑定数据时,使用 dataContainer 属性并引用 集合数据容器。请参考上面的示例。

分组项

分组项是由分组产生的特殊记录。以行的形式出现,仅包含分组表头。

groupdatagrid group items

为了渲染分组项,数据绑定层会创建一个临时的空实体或 DTO 实例。该实例不会添加到 集合容器 中,仅在分组时存在于内存中。

隐藏分组项计数

默认情况下,分组项显示分组内条目的数量。使用 groupColumndisplayItemCount 属性可以隐藏该数字。

groupdatagrid hide count

多层分组

组件支持按多列分组。点击分组列的图标可以打开 Group by 对话框,然后可以添加或移除列。

groupdatagrid multiple

禁用分组

如需禁止用于基于特定列进行分组,可以设置该列的 groupAllowed 属性为 false。这样就不会在 Group by 对话框中显示该列。下面的示例中,不允许按 Country 列分组:

groupdatagrid groupallowed
XML 代码
<groupg:groupDataGrid id="customersGroupDataGrid"
                      dataContainer="customersDc"
                      minWidth="100px"
                      width="100%">
    <groupg:groupBy>
        <groupg:columnRef key="grade"/>
    </groupg:groupBy>
    <groupg:columns>
        <groupg:groupColumn header="Grade"/>
        <groupg:column property="firstName"/>
        <groupg:column property="lastName"/>
        <groupg:column property="email"/>
        <groupg:column property="country" groupAllowed="false"/>
        <groupg:column property="grade"/>
    </groupg:columns>
</groupg:groupDataGrid>

如需禁止终端用户使用分组功能,设置 groupColumn 元素的 displayColumnsGrouperOnIconClick="false"

默认的分组仍然可以通过 groupBy 元素声明或 groupBy() 方法编程式设置。

自定义分组列

如需使用自定义分组值,在视图控制器中添加新的分组属性描述。以下示例引入了一个将名字和姓氏结合的新分组属性。

groupdatagrid custom column
XML 代码
<groupg:groupDataGrid id="customersGroupDataGrid"
                      dataContainer="customersDc"
                      minWidth="100px"
                      width="100%">
    <groupg:columns>
        <groupg:groupColumn key="group" header="Full name"/> <!-- 1 -->
        <groupg:column key="fullName" header="Full name"/>
        <groupg:column property="email"/>
        <groupg:column property="country"/>
        <groupg:column property="grade"/>
    </groupg:columns>
</groupg:groupDataGrid>
Java 代码
@ViewComponent
private GroupDataGrid<Customer> customersGroupDataGrid;

@Subscribe
public void onInit(InitEvent event) {
    GroupDataGridItems<Customer> items = customersGroupDataGrid.getItems();

    if (items != null) {
        items.addGroupPropertyDescriptor( (1)
                new BaseGroupPropertyDescriptor<Customer>("fullName",
                        context -> context.getItem().getFirstName() + " " + context.getItem().getLastName())
                        .withSortProperties(List.of("firstName", "lastName")));

        customersGroupDataGrid.groupByKeys("fullName"); (2)
    }
}
@Supply(to = "customersGroupDataGrid.fullName", subject = "renderer") (3)
protected Renderer<Customer> supplyRendererToFullNameColumn() {
    return new TextRenderer<>(item -> item.getFirstName() + " " + item.getLastName());
}
1 描述一个新的分组属性,由 firstNamelastName 拼接而成。
2 默认按 fullName 分组。
3 为“全名”列提供一个渲染回调,可以在不分组时显示内容。否则,不分组时列显示为空。

导出 Excel

导出功能由免费的 表格导出操作 扩展组件提供,该扩展组件支持所有表格类型:groupDataGriddataGridtreeDataGrid

groupdatagrid export

该扩展组件提供三种导出选项。有不同的导出范围以及生成 Excel 的格式:

  • All Rows – 导出所有行并展平分组。

  • Current Page – 仅导出当前可见行,同时 保留表格中显示的分组结构

  • Selected Rows – 导出当前选中的行并展平分组。

样式

主题

不同的样式版本可以通过 themeNames 属性配置。多个主题可以同时使用,样式版本与 dataGrid 数据网格 一样。

分组标签

组件中折叠的分组组显示 +,展开的分组显示 -。如需自定义图标,可以将图标添加到应用程序样式中。把默认的 content 值替换为所需的图标字符代码(例如,使用 Vaadin 字体图标 集合中的 e7c1e7bf):

application.css
vaadin-grid-tree-toggle.jmix-group-toggle {
    &::part(toggle)::before {
        content: "\e7c1";
    }

    &[expanded]::part(toggle)::before {
        content: "\e7bf";
    }
}
groupdatagrid groupicon

分组列图标

分组列图标可通过 groupColumn 元素的 groupIcon 属性进行自定义。如需隐藏图标,将 groupIconVisible 设置为 false

XML 属性

通用属性 对所有组件都是一样的配置。以下是与 dataGrid 数据网格 共享的属性以及 groupDataGrid 特有的属性:

名称

描述

默认值

aggregatable

如果为 true,则启用列的聚合。参阅 聚合

false

columnReorderingAllowed

如果为 true,则允许用户更改列的顺序。

false

emptyStateText

表格为空时显示的文本。使用 null 可移除当前的空状态内容。参阅 空状态

selectionMode

设置选择模式。支持:SINGLEMULTI

SINGLE

aggregationPosition

如果组件中的数据是 可聚合 的,则决定聚合行显示在其他行的上方还是下方。支持:TOPBOTTOM。参阅 聚合

BOTTOM

allRowsVisible

如果为 true,表格将一次显示所有行且不显示滚动条,从而有效禁用虚拟滚动。即表格会同时在 DOM 中渲染所有行,而不是仅渲染可见行并在用户滚动时加载更多行。

不建议在条目数量较大时使用此功能,因为可能会导致性能问题。

columnRendering

设置列渲染模式。在 EAGER 模式下,所有列都会预先渲染,无论其在视窗内是否可见。在 LAZY 模式下,仅当相应列位于可见视窗内时才渲染主体单元格。

EAGER

detailsVisibleOnClick

如果为 true,则支持通过鼠标单击显示 条目详情

true

dropMode

确定可以进行拖放的行。可选值:BETWEENON_TOPON_TOP_OR_BETWEENON_GRID。此特性可用于例如重新排序行以及在网格之间拖拽行。

editorBuffered

如果为 true,则为 内联编辑 启用缓存模式,即用户必须通过点击确认按钮来确认所做的更改。此模式还支持用户取消更改。在非缓存模式下,更改无需确认即可生效。

false

multiSort

如果为 true,则启用按多列排序。

false

multiSortOnShiftClickOnly

如果为 true,则仅当按住 Shift 键点击列标题时才激活多列排序。

false

multiSortPriority

设置被点击的列是添加到已排序列列表的末尾还是开头。可选值:PREPENDAPPEND

PREPEND

nestedNullBehavior

设置当解析嵌套属性时(属性链中可能包含 null 值)的行为。可选值:THROWALLOW_NULLS

THROW

pageSize

设置页面大小,即一次从数据提供者获取的条目数量。

50

rowsDraggable

如果为 true,则允许用户在网格中拖拽行。

false

sortByGroupEnabled

如果为 true

  • 为分组列启用排序。

  • 按其他列排序会在每个分组内重新排列行,但初始分组顺序保持不变。

如果为 false

  • 为分组列禁用排序。

  • 按其他列排序会相应地重新排列分组顺序。

true

事件和处理器

通用事件和处理器 对所有组件都是一样的配置。以下是与 dataGrid 数据网格 共享的处理器以及 groupDataGrid 特有的处理器:

在 Jmix Studio 生成处理器桩代码时,可以使用 Jmix UI 组件面板的 Handlers 标签页或者视图类顶部面板的 Generate Handler 添加,也可以通过 CodeGenerate 菜单(Alt+Insert / Cmd+N)生成。

名称

描述

CellFocusEvent

com.vaadin.flow.component.grid.CellFocusEvent 当表格中的单元格获得焦点时触发。对应 grid-cell-focus DOM 事件。

CollapseEvent

当分组折叠时触发。

ColumnReorderEvent

com.vaadin.flow.component.grid.ColumnReorderEvent 当表格中发生列重排时触发。对应 column-reorder-all-columns DOM 事件。

ColumnResizeEvent

com.vaadin.flow.component.grid.ColumnResizeEvent 当用户调整表格列的大小时触发。对应 column-drag-resize DOM 事件。

ExpandEvent

当分组展开时触发。

GridDragEndEvent

com.vaadin.flow.component.grid.dnd.GridDragEndEvent - 表格中行的拖拽结束事件。对应 grid-dragend DOM 事件。

GridDragStartEvent

com.vaadin.flow.component.grid.dnd.GridDragStartEvent - 表格中行的拖拽开始事件。对应 grid-dragstart DOM 事件。

GridDropEvent

com.vaadin.flow.component.grid.dnd.GridDropEvent - 发生在表格或其行上的放置事件。对应 grid-drop DOM 事件。

GroupItemClickEvent

当单击分组项内的行时触发。

GroupItemDoubleClickEvent

当双击分组项内的行时触发。

GroupingChangedEvent

当分组发生变化(添加或移除列)时触发。

ItemClickEvent

com.vaadin.flow.component.grid.ItemClickEvent 当单击表格项时触发。对应 item-click DOM 事件。

ItemDoubleClickEvent

com.vaadin.flow.component.grid.ItemDoubleClickEvent 当双击表格项时触发。对应 item-double-click DOM 事件。

SelectionEvent

选择事件,统一了多选和单选事件(在只需要单个选中条目的情况下)。

SortEvent

com.vaadin.flow.data.event.SortEvent - 描述 DataProvider 排序发生变化的事件。由 SortNotifiers 触发。

dataGenerator

为表格添加数据生成器。如果该生成器已添加,则不执行任何操作。参考 com.vaadin.flow.data.provider.HasDataGenerators 接口。

dragFilter

允许控制哪些特定行可以被拖拽,而不是通过 rowsDraggable 使所有行都可拖拽。

dropFilter

允许控制哪些特定行是有效的放置目标。

enterPressHandler

处理用户按下 Enter 键时的事件。

groupPartNameGenerator

根据给定条件为分组项生成 CSS 类名的 parts。支持自定义分组项。

groupTooltipGenerator

根据给定条件为分组生成 tooltip。

itemSelectableProvider

设置一个判断,用于检查表格中的特定项是否可由用户选择或取消选择。该方法接收一个条目实例,如果用户可以更改该条目的选择状态则返回 true,否则返回 false

partNameGenerator

根据给定条件为单元格生成 CSS 类名的 parts。支持根据所显示的数据自定义单元格外观。

tooltipGenerator

根据给定条件为列单元格生成 tooltip。参考 在线演示

XML 内部元素

如需为选中的元素添加内部元素,点击 Jmix UI 属性面板中的 Add 按钮。

groupBy

groupBy 元素包含一个或多个 columnRef 元素,指定哪些列用于分组。

columnRef

columnRef 元素定义用作分组的列。

columns

columns 元素包含 column 元素,并且定义这些列的共享属性。

column

column 元素声明单独的一列。为单独的列设置属性会覆盖 columns 上的设置。

groupColumn

groupColumn 元素声明用于分组的列,以及该列相对于其他列的位置。key 属性为必需。