ReoGrid 提供全面的选区系统,用于管理单元格、范围、行和列的选择,支持多个不连续选区、自定义选区行为和丰富的事件处理。
选区范围与焦点单元格
工作表上有两个活跃对象:选区范围和焦点单元格。
选区范围包含多个单元格,可以由用户通过鼠标和键盘选择,也可以通过编程方式选择。它通常用作工作表上范围操作的参数,例如设置样式和边框、删除内容或将内容复制到剪贴板。下图是范围 B2:D3 上的选区。

没有填充背景的高亮单元格显示为焦点单元格:

ReoGrid 始终将焦点单元格保持在选区范围内。当选区范围变更时,焦点单元格也会变更。相反,当焦点单元格变更时,选区范围也会变更——在这种情况下,选区范围等于焦点单元格。
选区范围
获取当前选区
// 获取当前选区范围
RangePosition selection = worksheet.SelectionRange;
// 访问各个属性
int startRow = selection.Row;
int startCol = selection.Col;
int rows = selection.Rows;
int cols = selection.Cols;
int endRow = selection.EndRow;
int endCol = selection.EndCol;
以编程方式设置选区
// 通过地址字符串选择
worksheet.SelectRange("B2:D5");
// 通过行、列、行数、列数选择
worksheet.SelectRange(1, 1, 4, 3);
// 通过 RangePosition 选择
worksheet.SelectRange(new RangePosition(1, 1, 4, 3));
// 通过两个单元格位置(起始和结束)选择
worksheet.SelectRange(new CellPosition(1, 1), new CellPosition(4, 3));
// 选择整行
worksheet.SelectRows(2, 3); // 从第 2 行开始的 3 行
// 选择整列
worksheet.SelectColumns(1, 2); // 从第 1 列开始的 2 列
// 选择所有单元格
worksheet.SelectAll();
SelectRange(range, scrollToSelectRange) 的第二个参数控制视图是否滚动以显示选区(默认值:true):
// 选择但不滚动
worksheet.SelectRange(new RangePosition(100, 0, 1, 1), scrollToSelectRange: false);
焦点单元格
焦点单元格是选区内的单个活跃单元格,键盘输入会进入该单元格:
// 获取当前焦点位置
CellPosition focusPos = worksheet.FocusPos;
// 设置焦点位置
worksheet.FocusPos = new CellPosition("C3");
worksheet.FocusPos = new CellPosition(2, 2);
焦点位置样式
控制焦点单元格的显示方式:
// 默认样式(高亮单元格)
worksheet.FocusPosStyle = FocusPosStyle.Default;
// 焦点单元格无特殊显示
worksheet.FocusPosStyle = FocusPosStyle.None;
悬停位置
获取鼠标光标下的单元格:
CellPosition hoverPos = worksheet.HoverPos;
选区模式
控制用户可以选择的内容:
worksheet.SelectionMode = WorksheetSelectionMode.Range;
| 模式 | 描述 |
|---|---|
None | 禁用选择 |
Cell | 只能选择单个单元格 |
Range | 可以选择单元格或范围(默认) |
Row | 始终选择整行 |
Column | 始终选择整列 |
选区样式
控制选区的视觉外观:
默认样式
worksheet.SelectionStyle = WorksheetSelectionStyle.Default;

Windows 焦点矩形样式
worksheet.SelectionStyle = WorksheetSelectionStyle.FocusRect;

隐藏选区
worksheet.SelectionStyle = WorksheetSelectionStyle.None;

选区前进方向
控制编辑完成后(按 Enter 键)焦点的移动方向:
// 向右移动(同一行的下一个单元格)——默认
worksheet.SelectionForwardDirection = SelectionForwardDirection.Right;

// 向下移动(下一行的单元格)
worksheet.SelectionForwardDirection = SelectionForwardDirection.Down;

// 自动——Enter 向下移动,Tab 向右移动
worksheet.SelectionForwardDirection = SelectionForwardDirection.Auto;
多选
启用 AllowMultipleSelection 后,ReoGrid 支持不连续选区(按住 Ctrl/Cmd 键点击):
// 启用多选
worksheet.AllowMultipleSelection = true;
// 获取主选区
var primary = worksheet.SelectionRange;
// 获取所有选中的块
foreach (var range in worksheet.SelectionRanges)
{
Console.WriteLine(range.ToAddress());
}
SelectionRanges 集合
| 属性/方法 | 描述 |
|---|---|
Count | 选中范围的数量 |
Add(RangePosition) | 向选区添加范围 |
Remove(RangePosition) | 从选区移除范围 |
Clear() | 清除所有选区 |
Contains(RangePosition) | 检查范围是否已选中 |
注意: 内置编辑命令(删除、粘贴、输入)作用于活跃选区(最后点击的范围)。要对所有选区应用操作,请遍历
SelectionRanges:foreach (var range in worksheet.SelectionRanges) { worksheet.SetRangeStyles(range, style); }
使用 Ctrl 键多选行
// 允许使用 Ctrl+点击选择多行
worksheet.AllowMultipleRowWithCtrlKey = true;
移动选区
编程式移动
// 向某个方向移动
worksheet.MoveSelection(SelectionMoveDirection.Right);
worksheet.MoveSelection(SelectionMoveDirection.Down);
// 定向移动,可选扩展(Shift 选择行为)
worksheet.MoveSelectionUp(appendSelect: false);
worksheet.MoveSelectionDown(appendSelect: false);
worksheet.MoveSelectionLeft(appendSelect: false);
worksheet.MoveSelectionRight(appendSelect: false);
// 移动到行/列的开头或结尾
worksheet.MoveSelectionHome(RowOrColumn.Column); // 移动到第一行
worksheet.MoveSelectionHome(RowOrColumn.Row); // 移动到第一列
worksheet.MoveSelectionEnd(RowOrColumn.Column); // 移动到最后一行
worksheet.MoveSelectionEnd(RowOrColumn.Row); // 移动到最后一列
// 上翻/下翻页
worksheet.MoveSelectionPageUp();
worksheet.MoveSelectionPageDown();
// 前进移动焦点(Enter 行为)
worksheet.MoveSelectionForward();
worksheet.MoveSelectionBackward();
// 向右移动焦点
worksheet.MoveFocusRight(autoReturn: true); // 到末尾时换行到下一行
// 向下移动焦点
worksheet.MoveFocusDown(autoReturn: true); // 到末尾时换行到下一列
移动到未锁定的单元格
当工作表被锁定时,将选区移动到下一个未锁定的单元格:
worksheet.MoveSelectionRangeToUnlockedCell();
光标样式
更改工作表上的光标样式:
worksheet.ChangeCursor(CursorStyle.Hand);
事件
选区变更事件
// 选区变更前(可取消)
worksheet.BeforeSelectionRangeChange += (s, e) =>
{
// 访问建议的选区
Console.WriteLine($"Selection changing to: ({e.StartRow},{e.StartCol})-({e.EndRow},{e.EndCol})");
// 取消变更
e.IsCancelled = true;
// 或修改建议的范围
e.EndRow = Math.Min(e.EndRow, e.StartRow + 4); // 限制为 5 行
};
// 选区变更中(拖动时)
worksheet.SelectionRangeChanging += (s, e) =>
{
// e.Range 包含拖动期间的当前选区
};
// 选区确定后
worksheet.SelectionRangeChanged += (s, e) =>
{
Console.WriteLine("Selection changed: " + e.Range.ToAddress());
};
注意:
SelectionRangeChanged仅在鼠标按钮释放时触发,而不是在拖动期间。使用SelectionRangeChanging可以在鼠标拖动期间跟踪实时选区变化。
选区移动事件
// 前进移动(Enter 键)
worksheet.SelectionMovedForward += (s, e) =>
{
e.IsCancelled = true; // 阻止默认行为
// 自定义:始终移动到下一行的第一个单元格
worksheet.SelectionRange = new RangePosition(
worksheet.SelectionRange.Row + 1, 0, 1, 1);
};
// 后退移动(Shift+Enter)
worksheet.SelectionMovedBackward += (s, e) =>
{
e.IsCancelled = true;
// 自定义后退逻辑
};
其他选区事件
// 选区模式变更
worksheet.SelectionModeChanged += (s, e) => { };
// 选区样式变更
worksheet.SelectionStyleChanged += (s, e) => { };
// 选区前进方向变更
worksheet.SelectionForwardDirectionChanged += (s, e) => { };
// 焦点位置变更
worksheet.FocusPosChanged += (s, e) => { };
// 焦点位置样式变更
worksheet.FocusPosStyleChanged += (s, e) => { };
// 悬停位置变更(鼠标移动到不同单元格上)
worksheet.HoverPosChanged += (s, e) => { };
BeforeSelectionChangeEventArgs 属性
| 属性 | 类型 | 描述 |
|---|---|---|
SelectionStart | CellPosition | 建议选区的起始位置 |
SelectionEnd | CellPosition | 建议选区的结束位置 |
StartRow | int | 起始行(可修改) |
StartCol | int | 起始列(可修改) |
EndRow | int | 结束行(可修改) |
EndCol | int | 结束列(可修改) |
IsCancelled | bool | 设置为 true 以取消选区变更 |
限制选区范围
限制最大行数和列数
worksheet.BeforeSelectionRangeChange += (s, e) =>
{
int maxRows = 5;
int maxCols = 3;
int rows = Math.Abs(e.StartRow - e.EndRow);
if (rows >= maxRows)
{
e.EndRow = e.EndRow > e.StartRow
? e.StartRow + maxRows - 1
: e.StartRow - maxRows + 1;
}
int cols = Math.Abs(e.StartCol - e.EndCol);
if (cols >= maxCols)
{
e.EndCol = e.EndCol > e.StartCol
? e.StartCol + maxCols - 1
: e.StartCol - maxCols + 1;
}
};
将选区限制在特定区域
worksheet.BeforeSelectionRangeChange += (s, e) =>
{
// 仅允许在 B2:F10 中选择
if (e.StartRow < 1 || e.StartCol < 1 || e.EndRow > 9 || e.EndCol > 5)
{
e.IsCancelled = true;
}
};
使用键盘事件自定义导航
使用键盘事件覆盖导航行为:
worksheet.BeforeCellKeyDown += (s, e) =>
{
if (e.KeyCode == Keys.Enter)
{
e.IsCancelled = true;
// 始终移动到下一行的第一个单元格
worksheet.SelectionRange =
new RangePosition(worksheet.SelectionRange.Row + 1, 0, 1, 1);
}
};
内置键盘操作
有关所有支持的键盘快捷键,请参阅快捷键参考。