冻结窗格允许您锁定行和/或列,使其在用户滚动时保持可见。这对于在处理大型数据集时保持标题或标签可见非常有用。

基本冻结

在指定的单元格位置冻结行和列:

var sheet = grid.CurrentWorksheet;

// 冻结到第 5 行(第 0~4 行固定在顶部)
sheet.FreezeToCell(5, 0);

33

FreezeToCell 重载

签名说明
FreezeToCell(CellPosition pos)在指定的单元格位置冻结
FreezeToCell(string address)在地址处冻结(例如 "B5"
FreezeToCell(int row, int col)在行和列索引处冻结
FreezeToCell(CellPosition pos, FreezeArea area)在指定位置和区域冻结
FreezeToCell(int row, int col, FreezeArea area)在索引和指定区域处冻结

示例

// 在地址处冻结
sheet.FreezeToCell("B5");

// 在 CellPosition 处冻结
sheet.FreezeToCell(new CellPosition(5, 1));

// 在第 3 行第 2 列冻结
sheet.FreezeToCell(3, 2);

冻结区域

ReoGrid 支持在一条或两条相邻边冻结。使用 FreezeArea 枚举指定冻结区域的位置:

FreezeArea 值说明
None不冻结
Left冻结左侧列
Top冻结顶部行
Right冻结右侧列
Bottom冻结底部行
LeftTop冻结左侧列和顶部行(默认)
LeftBottom冻结左侧列和底部行
RightTop冻结右侧列和顶部行
RightBottom冻结右侧列和底部行

85

示例:在右下方冻结

sheet.FreezeToCell(5, 5, FreezeArea.RightBottom);

示例:仅冻结顶部行

sheet.FreezeToCell(3, 0, FreezeArea.Top);

示例:仅冻结左侧列

sheet.FreezeToCell(0, 2, FreezeArea.Left);

取消冻结

移除所有冻结设置:

sheet.Unfreeze();

属性

属性类型说明
FreezeAreaFreezeArea当前冻结区域类型(只读)
FreezePosCellPosition当前冻结位置(只读)
IsFrozenbool工作表当前是否已冻结(只读)
// 获取当前冻结状态
FreezeArea area = sheet.FreezeArea;
CellPosition pos = sheet.FreezePos;
bool frozen = sheet.IsFrozen;

检查是否可以冻结

在冻结之前,验证工作表是否支持冻结:

if (sheet.CanFreeze())
{
    sheet.FreezeToCell(3, 2);
}

当工作表的当前状态不支持冻结时(例如使用了自定义视口控制器),CanFreeze() 返回 false

事件

事件类型说明
CellsFrozenEventHandler工作表冻结后触发
CellsUnfrozenEventHandler工作表取消冻结后触发
sheet.CellsFrozen += (s, e) =>
{
    Console.WriteLine($"Frozen at {sheet.FreezePos}, area: {sheet.FreezeArea}");
};

sheet.CellsUnfrozen += (s, e) =>
{
    Console.WriteLine("Worksheet unfrozen");
};

冻结区域过大

如果冻结区域大于整个控件,活动(可滚动)区域将变得不可见。

在以下情况可能发生:

  • 指定了正常的冻结区域,但控件被缩小到过小
  • 指定了过大的冻结区域

86

例如,如果网格有 100 行且最大可见行数为 30,在底部冻结到第 60 行需要 40 行的冻结区域 — 超出了可见区域,使活动区域不可见。

注意: 始终确保冻结位置为活动可滚动区域留出足够的空间。建议在应用之前使用 CanFreeze() 进行验证。

配合多行标题使用

冻结窗格可以与多行列标题配合使用。当工作表滚动时,冻结的列及其多行标题保持可见。参见多行标题

相关主题

这篇文章对您有帮助吗?