073 TreeTable · 树形表格
用途
把树形层级与表格列结合:首列显示展开箭头与缩进,其余列显示属性。支持展开、选择、列宽与列顺序、排序状态(同级节点在本地排序,结果按父节点缓存,只在子项或排序变化时重新计算),以及外部加载子项。只构建可见行。
最小示例
kids := map[string][]string{"Vestry": {"Stole", "Alb"}}
size := map[string]int{"Vestry": 9, "Stole": 2, "Alb": 5, "Organ": 7}
var state data.TreeTableState[string]
view := func(c *ui.Context) {
core.Use(c, core.Settings{})
data.TreeTable(c, &state, data.TreeTableOptions[string]{
Roots: []string{"Vestry", "Organ"},
Children: func(n string) []string { return kids[n] },
Label: func(n string) string { return n },
Columns: []data.TreeColumn[string]{
{ID: "name", Title: "Name", Cell: func(n string) { ui.Text(c, n) },
Compare: cmp.Compare[string]},
{ID: "size", Title: "Size", Width: 80, Align: ui.End,
Cell: func(n string) { ui.Text(c, strconv.Itoa(size[n])) }},
},
}).Element.Size(360, 240)
}
ui.Render(view, 400, 300, 1)参数
func TreeTable[K comparable](c *ui.Context, s *TreeTableState[K], opts TreeTableOptions[K]) DataTableView。TreeTableState 字段:Sort、Layout、Selection;方法:Selected()、SetOpen、IsOpen。表格上方的“列”按钮弹层提供每列的排序、左移/右移与列宽调整,是这些操作的键盘入口。
| 字段 | 类型 | 默认值 | 含义 |
|---|---|---|---|
Columns | []TreeColumn[K] | 必填 | 列:ID(必填、唯一)、Title、Width、MinWidth、Align、Compare(设置后可点击排序同级节点)、Cell(必填)。首列在箭头后显示 Cell。 |
Roots | []K | 空 | 顶层节点。 |
Children | func(K) []K | 必填 | 子节点:nil 为叶子,空切片为未加载。子项变化时请返回新切片(排序缓存按切片识别)。 |
Label | func(K) string | 必填 | 无障碍名称与输入定位。 |
ItemStatus, Load | nil | 与 Tree 相同的外部加载协议。 | |
Multiple | bool | false | 多选。 |
Status | DataStatus | DataReady | 加载状态:DataLoading 首次加载(无行时显示加载标记)、DataLoadingMore 追加加载(行下方显示“正在加载更多”)、DataFailed 失败(显示错误与“重试”)。 |
Error | string | 内置“加载失败” | DataFailed 时显示的具体错误。 |
Empty | string | 内置“暂无数据” | 无数据时的说明文字。 |
状态
默认、悬停、选中(Selection 背景 + AccentText 勾选标记)、聚焦、展开/折叠、排序箭头、子项加载中/失败、空。
事件
返回 DataTableView:Changed()、Submitted()、SortChanged()、Retried()。
键盘操作
- 与 Tree 相同的方向键与展开键;点击表头排序同级节点,再次点击反向;拖动表头边缘或表头调整列宽与顺序。
- 列菜单:Tab 到“列”按钮,Enter 打开,Tab 到排序、移动与列宽按钮,Enter 执行,Escape 关闭。
限制
- 基于 MyGo
ui.OutlineTable;表头只能显示文字。 - 排序只作用于同级节点,层级关系保持不变。

