ReoGrid 提供全面的选区系统,用于管理单元格、范围、行和列的选择,支持多个不连续选区、自定义选区行为和丰富的事件处理。

选区范围与焦点单元格

工作表上有两个活跃对象:选区范围焦点单元格

选区范围包含多个单元格,可以由用户通过鼠标和键盘选择,也可以通过编程方式选择。它通常用作工作表上范围操作的参数,例如设置样式和边框、删除内容或将内容复制到剪贴板。下图是范围 B2:D3 上的选区。

168

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

195

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;

161

Windows 焦点矩形样式

worksheet.SelectionStyle = WorksheetSelectionStyle.FocusRect;

162

隐藏选区

worksheet.SelectionStyle = WorksheetSelectionStyle.None;

163

选区前进方向

控制编辑完成后(按 Enter 键)焦点的移动方向:

// 向右移动(同一行的下一个单元格)——默认
worksheet.SelectionForwardDirection = SelectionForwardDirection.Right;

164

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

165

// 自动——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 属性

属性类型描述
SelectionStartCellPosition建议选区的起始位置
SelectionEndCellPosition建议选区的结束位置
StartRowint起始行(可修改)
StartColint起始列(可修改)
EndRowint结束行(可修改)
EndColint结束列(可修改)
IsCancelledbool设置为 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);
    }
};

内置键盘操作

有关所有支持的键盘快捷键,请参阅快捷键参考。

相关主题

这篇文章对您有帮助吗?