GroupDataGrid 分组表格
基本用法
在视图 XML 中声明 groupg 命名空间:
<view xmlns="http://jmix.io/schema/flowui/view"
xmlns:groupg="http://jmix.io/schema/groupgrid/ui">
|
当使用顶部操作面板中的 Add Component 操作添加组件时,Studio 会自动添加该命名空间。请参见 组件面板。 |
下面的例子中,用户按 Grade 列进行了分组:
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 属性并引用 集合数据容器。请参考上面的示例。
分组项
排序
关于排序的配置,与 dataGrid 的配置相同。sortByGroupEnabled 属性定义排序是否影响分组顺序。
表头过滤
可以使用表头中的 属性过滤器 按单独的某一列过滤数据。可过滤的列会在其表头中显示一个漏斗图标()。点击该图标会打开过滤器对话框。
在 columns 元素上将 filterable 属性设置为 true,可为实体属性的所有列启用过滤。如需为单个列启用或禁用过滤,请在其 column 元素上设置 filterable。column 上的设置优先于 columns 上的设置:
<groupg:groupDataGrid id="customersDataGrid"
width="100%"
minHeight="20em"
dataContainer="customersDc">
<groupg:groupBy>
<groupg:columnRef key="grade"/>
</groupg:groupBy>
<groupg:columns filterable="true">
<groupg:groupColumn header="Grade"/>
<groupg:column property="firstName"/>
<groupg:column property="lastName"/>
<groupg:column property="email"/>
<groupg:column property="country"/>
<groupg:column property="grade"/>
</groupg:columns>
</groupg:groupDataGrid>
与独立的 propertyFilter 和 genericFilter 通用过滤器 组件一样,表头过滤器会将条件添加到 数据加载器。在标准数据加载流程中,条件会被转换为 JPQL 并在数据库层面执行。所有过滤器的条件使用逻辑 AND 组合。
|
Jmix 3.1+ 可以通过将 |
禁用分组
如需禁止用于基于特定列进行分组,可以设置该列的 groupAllowed 属性为 false。这样就不会在 Group by 对话框中显示该列。下面的示例中,不允许按 Country 列分组:
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() 方法编程式设置。
|
自定义分组列
如需使用自定义分组值,在视图控制器中添加新的分组属性描述。以下示例引入了一个将名字和姓氏结合的新分组属性。
这种合成属性不会自动排序。为了让排序机制也能正常,可以在分组属性描述符中使用 .withSortProperties(…) 指定排序属性。
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"))); (2)
customersGroupDataGrid.groupByKeys("fullName"); (3)
}
}
@Supply(to = "customersGroupDataGrid.fullName", subject = "renderer") (4)
protected Renderer<Customer> supplyRendererToFullNameColumn() {
return new TextRenderer<>(item -> item.getFirstName() + " " + item.getLastName());
}
| 1 | 描述一个新的分组属性,由 firstName 和 lastName 拼接而成。 |
| 2 | .withSortProperties(List.of("firstName", "lastName")) 告诉组件如何对合成属性排序。 |
| 3 | 默认按 fullName 分组。 |
| 4 | 为“全名”列提供一个渲染回调,可以在不分组时显示内容。否则,不分组时列显示为空。 |
导出 Excel
导出功能由免费的 表格导出操作 扩展组件提供,该扩展组件支持所有表格类型:groupDataGrid、dataGrid 和 treeDataGrid。
该扩展组件提供三种导出选项。有不同的导出范围以及生成 Excel 的格式:
-
All Rows – 导出所有行并展平分组。
-
Current Page – 仅导出当前可见行,同时 保留表格中显示的分组结构。
-
Selected Rows – 导出当前选中的行并展平分组。
样式
分组标签
组件中折叠的分组组显示 +,展开的分组显示 -。如需自定义图标,可以将图标添加到应用程序样式中。把默认的 content 值替换为所需的图标字符代码(例如,使用 Vaadin 字体图标 集合中的 e7c1 和 e7bf):
vaadin-grid-tree-toggle.jmix-group-toggle {
&::part(toggle)::before {
content: "\e7c1";
}
&[expanded]::part(toggle)::before {
content: "\e7bf";
}
}
| 参考 组件的可样式化 parts。 |
分组列图标
分组列图标可通过 groupColumn 元素的 groupIcon 属性进行自定义。如需隐藏图标,将 groupIconVisible 设置为 false。
XML 属性
下面是 groupDataGrid 的特殊属性:
名称 |
描述 |
默认值 |
|---|---|---|
如果为 |
|
|
如果为 |
|
|
表格为空时显示的文本。使用 null 可移除当前的空状态内容。参阅 空状态。 |
– |
|
设置选择模式。支持: |
|
|
|
||
如果为 不建议在条目数量较大时使用此功能,因为可能会导致性能问题。 |
– |
|
设置列渲染模式。在 |
|
|
如果为 |
|
|
确定可以进行拖放的行。可选值: |
– |
|
如果为 |
|
|
如果为 |
|
|
如果为 |
|
|
设置被点击的列是添加到已排序列列表的末尾还是开头。可选值: |
|
|
设置当解析嵌套属性时(属性链中可能包含 null 值)的行为。可选值: |
|
|
设置页面大小,即一次从数据提供者获取的条目数量。 |
|
|
如果为 |
|
|
如果为
如果为
|
|
下面是 groupDataGrid 支持的其他通用属性:
id - alignSelf - ariaLabel - classNames - colspan - css - dataContainer - enabled - focusShortcut - height - justifySelf - maxHeight - maxWidth - metaClass - minHeight - minWidth - tabIndex - themeNames - visible - width
事件和处理器
下面是 groupDataGrid 的特殊事件和处理器:
|
在 Jmix Studio 生成处理器桩代码时,可以使用 Jmix UI 组件面板的 Handlers 标签页或者视图类顶部面板的 Generate Handler 添加,也可以通过 Code → Generate 菜单(Alt+Insert / Cmd+N)生成。 |
| 名称 | 描述 |
|---|---|
|
|
当分组折叠时触发。 |
|
|
|
|
|
当分组展开时触发。 |
|
|
|
|
|
|
|
当单击分组项内的行时触发。 |
|
当双击分组项内的行时触发。 |
|
当分组发生变化(添加或移除列)时触发。 |
|
|
|
|
|
选择事件,统一了多选和单选事件(在只需要单个选中条目的情况下)。 |
|
|
|
为表格添加数据生成器。如果该生成器已添加,则不执行任何操作。参考 |
|
允许控制哪些特定行可以被拖拽,而不是通过 rowsDraggable 使所有行都可拖拽。 |
|
允许控制哪些特定行是有效的放置目标。 |
|
处理用户按下 Enter 键时的事件。 |
|
根据给定条件为分组项生成 CSS 类名的 parts。支持自定义分组项。 |
|
根据给定条件为分组生成 tooltip。 |
|
设置一个判断,用于检查表格中的特定项是否可由用户选择或取消选择。该方法接收一个条目实例,如果用户可以更改该条目的选择状态则返回 |
|
根据给定条件为单元格生成 CSS 类名的 parts。支持根据所显示的数据自定义单元格外观。 |
|
从 |
|
根据给定条件为列单元格生成 tooltip。参考 在线演示。 |
下面是 groupDataGrid 支持的其他通用事件:
XML 内部元素
一个 groupDataGrid 可以包含 actions, groupBy、columns、contextMenu 和 emptyStateComponent 作为其直接内部元素。一个 columns 可以包含 column、groupColumn 和 editorActionsColumn。与数据网格同样的属性参考 actions、contextMenu 和 emptyStateComponent。
|
如需为选中的元素添加内部元素,点击 Jmix UI 属性面板中的 Add 按钮。 |
groupBy
groupBy 元素包含一个或多个 columnRef 元素,指定哪些列用于分组。
columns
columns 元素包含 column 元素,并且定义这些列的共享属性。支持 includeAll、exclude、sortable、resizable 和 filterable,参考数据网格的 columns。
column
column 元素声明单独的一列。为单独的列设置属性会覆盖 columns 上的设置。支持数据网格 column 的配置,并添加了 groupAllowed 属性,用于设置是否允许对改列进行分组。
groupColumn
groupColumn 元素声明用于分组的列,以及该列相对于其他列的位置。key 属性为必需。可以包含一个内部的 groupIcon 元素用于提供自定义图标组件。
| 名称 | 描述 | 默认值 |
|---|---|---|
设置当没有分组属性时是否自动隐藏分组列。 |
— |
|
设置列宽是否根据其内容计算。 |
— |
|
设置点击分组图标是否打开 Group by 对话框。 |
— |
|
设置分组标题是否显示子条目的数量。请参见 隐藏分组项计数。 |
— |
|
设置该列相对于其他列的延展量。 |
— |
|
设置列 footer 文本。 |
— |
|
将列锁定在网格的起始边缘。 |
— |
|
将列锁定在网格的末尾边缘。 |
— |
|
使用 Vaadin 图标名称设置分组图标。当需要图标组件时,使用内部的 |
— |
|
设置分组图标是否可见。 |
— |
|
设置列 header 文本。 |
— |
|
设置用于标识分组列的列键值。 |
— |
|
设置用户是否可以调整列大小。 |
— |
|
设置用户是否可以按分组列排序。 |
— |
|
设置列是否可见。 |
— |
|
以 CSS 字符串设置列宽,使用 |
— |