ReoGrid 支持行和列的大纲(分组),允许您折叠和展开工作表的各个部分。这对于组织层次数据、创建可折叠区域和构建汇总视图非常有用。

29 (1)

添加大纲

分组行或列

// 从第 3 行开始分组 5 行
sheet.GroupRows(3, 5);

// 从第 5 列开始分组 2 列
sheet.GroupColumns(5, 2);

// 使用 RowOrColumn 标志的通用方法
sheet.AddOutline(RowOrColumn.Row, 3, 5);
sheet.AddOutline(RowOrColumn.Column, 5, 2);

AddOutlineGroupRows/GroupColumns 方法会返回创建的大纲实例:

var outline = sheet.GroupRows(3, 5);

嵌套大纲

大纲最多可以嵌套 10 层。每一层在大纲面板中显示为一个单独的分组:

// 第 1 层:分组第 2-8 行
sheet.GroupRows(2, 7);

// 第 2 层:子分组第 3-5 行
sheet.GroupRows(3, 3);

异常

AddOutline 可能抛出以下异常:

异常描述
OutlineIntersectedException大纲与同一层级的现有大纲重叠
OutlineAlreadyDefinedException已存在相同的大纲
OutlineTooMuchException已达到最大 10 层大纲限制
OutlineOutOfRangeException位置超出工作表范围(最后一行/列不能包含在内)

折叠和展开

通过大纲实例

var outline = sheet.GroupRows(3, 5);

outline.Collapse();   // 折叠(隐藏分组的行)
outline.Expand();     // 展开(显示分组的行)

// 检查状态
bool isCollapsed = outline.Collapsed;

通过工作表方法

通过起始位置和数量指定大纲:

sheet.CollapseOutline(RowOrColumn.Row, 3, 5);
sheet.ExpandOutline(RowOrColumn.Row, 3, 5);

如果没有匹配的大纲,这些方法将返回大纲实例或抛出 OutlineNotFoundException

折叠/展开分组层级中的所有大纲

// 获取特定大纲分组层级(从零开始)
var group = sheet.GetOutlineGroup(RowOrColumn.Row, 0);  // 第 0 层

group.CollapseAll();
group.ExpandAll();

移除大纲

移除特定大纲

// 按位置和数量
sheet.RemoveOutline(RowOrColumn.Row, 3, 5);

// 按实例
sheet.RemoveOutline(outline);

// 使用简写方法
sheet.UngroupRows(3, 5);
sheet.UngroupColumns(5, 2);

移除所有大纲

// 移除所有行大纲
sheet.UngroupAllRows();

// 移除所有列大纲
sheet.UngroupAllColumns();

访问大纲

获取特定大纲

var outline = sheet.GetOutline(RowOrColumn.Row, 3, 5);
if (outline != null)
{
    Console.WriteLine($"Outline: {outline.Start} to {outline.End}, collapsed: {outline.Collapsed}");
}

访问大纲集合

// 获取行大纲集合
var rowOutlines = sheet.RowOutlines;

// 获取列大纲集合
var colOutlines = sheet.ColumnOutlines;

// 按标志获取大纲集合
var outlines = sheet.GetOutlines(RowOrColumn.Row);

// 获取大纲分组层级数量
int levels = sheet.GetOutlineGroupCount(RowOrColumn.Row);

遍历所有大纲

sheet.IterateOutlines(RowOrColumn.Row, (group, outline) =>
{
    Console.WriteLine($"Outline: rows {outline.Start}{outline.End}, collapsed: {outline.Collapsed}");
    return true; // 继续遍历
});

大纲属性

IOutline / BaseOutline 属性

属性类型描述
Startint起始行/列索引
Countint大纲中的行/列数量
Endint结束索引(Start + Count)
Collapsedbool大纲是否已折叠
WorksheetWorksheet父工作表
IsVisibleToUserbool大纲是否对用户可见
GroupRowIndexint分组汇总行的索引

RowOutline 特有属性

属性类型描述
Rowint起始行索引(同 Start)
Rowsint行数(同 Count)
EndRowint结束行索引

ColumnOutline 特有属性

属性类型描述
Colint起始列索引(同 Start)
Colsint列数(同 Count)
EndColint结束列索引

大纲按钮位置

控制展开/折叠按钮显示在分组行的上方还是下方:

// 按钮在底部(默认)
sheet.OutlineButtonLocation = OutlineButtonLocation.Bottom;

// 按钮在顶部
sheet.OutlineButtonLocation = OutlineButtonLocation.Top;

分组行样式

自定义每个大纲的汇总行外观:

// 获取特定行的分组行样式
var style = sheet.GetGroupRowStyle(3);

// 尝试获取分组行样式(未找到时返回 false)
if (sheet.TryGetGroupRowStyle(3, out var groupStyle))
{
    // 使用 groupStyle
}

// 获取分组行边框样式
var borderStyle = sheet.GetGroupRowBorderStyle(3);
borderStyle.Style = BorderLineStyle.Solid;
borderStyle.Color = new SolidColor(Color.Gray);

您也可以直接从大纲实例访问样式:

var outline = sheet.GroupRows(3, 5);

// 设置分组行样式
outline.GroupRowStyle.Flag = PlainStyleFlag.FillColor;
outline.GroupRowStyle.BackColor = Color.LightYellow;

// 设置分组行边框样式
outline.GroupRowBorderStyle.Style = BorderLineStyle.Dashed;
outline.GroupRowBorderStyle.Color = new SolidColor(Color.LightGray);

自动折叠和展开

如果展开的大纲的最后一行被隐藏或高度设为零,大纲会自动折叠。如果折叠的大纲中有任何行变为可见,大纲会自动展开。此行为无法禁用,但折叠/展开事件仍然会触发。

Outline

调整行高后:

Outline Auto Hide

自动移除

如果大纲内的所有行或列都被删除,大纲会被自动移除。在这种情况下会触发 OutlineRemoved 事件。

事件

工作表级事件

事件事件参数描述
OutlineAddedOutlineAddedEventArgs大纲已添加
OutlineRemovedOutlineRemovedEventArgs大纲已移除
BeforeOutlineCollapseBeforeOutlineCollapseEventArgs大纲折叠前(可取消)
AfterOutlineCollapseAfterOutlineCollapseEventArgs大纲折叠后
BeforeOutlineExpandBeforeOutlineExpandingEventArgs大纲展开前(可取消)
AfterOutlineExpandAfterOutlineExpandingEventArgs大纲展开后

事件参数属性

所有事件参数都继承自 OutlineEventArgs

  • Outline (IOutline) — 触发事件的大纲

BeforeOutlineCollapseEventArgsBeforeOutlineExpandingEventArgs 额外包含:

  • IsCancelled (bool) — 设置为 true 以阻止操作

工作表事件示例

sheet.OutlineAdded += (s, e) =>
{
    Console.WriteLine($"Outline added: {e.Outline.Start} to {e.Outline.End}");
};

sheet.OutlineRemoved += (s, e) =>
{
    Console.WriteLine($"Outline removed: {e.Outline.Start} to {e.Outline.End}");
};

sheet.BeforeOutlineCollapse += (s, e) =>
{
    Console.WriteLine("Before collapse");
    // e.IsCancelled = true;  // 阻止折叠
};

sheet.AfterOutlineCollapse += (s, e) =>
{
    Console.WriteLine("After collapse");
};

sheet.BeforeOutlineExpand += (s, e) =>
{
    Console.WriteLine("Before expand");
};

sheet.AfterOutlineExpand += (s, e) =>
{
    Console.WriteLine("After expand");
};

大纲实例事件

每个大纲实例也会触发自己的事件:

var outline = sheet.GroupRows(3, 5);

outline.BeforeCollapse += (s, e) =>
{
    Console.WriteLine("Instance: before collapse");
    // e.IsCancelled = true;
};

outline.AfterCollapse += (s, e) =>
{
    Console.WriteLine("Instance: after collapse");
};

outline.BeforeExpand += (s, e) =>
{
    Console.WriteLine("Instance: before expand");
};

outline.AfterExpand += (s, e) =>
{
    Console.WriteLine("Instance: after expand");
};

阻止折叠/展开

使用 before 事件上的 IsCancelled 属性:

sheet.BeforeOutlineCollapse += (s, e) => e.IsCancelled = true;

隐藏大纲面板

隐藏大纲 UI 以阻止用户交互,同时仍允许编程控制:

// 隐藏行和列大纲面板
sheet.SetSettings(WorksheetSettings.View_AllowShowRowOutlines, false);
sheet.SetSettings(WorksheetSettings.View_AllowShowColumnOutlines, false);

Custom Header

当面板隐藏时,大纲仍可通过编程方式控制:

var outline1 = sheet.GroupRows(1, 3);
outline1.Collapse();

var outline2 = sheet.GroupRows(5, 2);
outline2.Collapse();

重新显示大纲面板:

sheet.SetSettings(WorksheetSettings.View_AllowShowRowOutlines, true);
sheet.SetSettings(WorksheetSettings.View_AllowShowColumnOutlines, true);

使用操作(撤销/重做支持)

大纲操作可以通过操作来执行,以支持撤销/重做:

// 添加大纲(支持撤销)
sheet.DoAction(new AddOutlineAction(RowOrColumn.Row, 3, 5));

// 移除大纲(支持撤销)
sheet.DoAction(new RemoveOutlineAction(RowOrColumn.Row, 3, 5));

// 折叠/展开(支持撤销)
sheet.DoAction(new CollapseOutlineAction(RowOrColumn.Row, 3, 5));
sheet.DoAction(new ExpandOutlineAction(RowOrColumn.Row, 3, 5));

相关主题

这篇文章对您有帮助吗?