ReoGrid 提供单元格级和工作表级的保护功能,以防止用户修改数据。包括锁定单个单元格、锁定整个工作表以及将工作簿设为只读。

单元格级锁定

每个单元格都有一个 IsLocked 属性,类型为 CellLock,用于控制单元格是否可以编辑。

CellLock 枚举

描述
Inherit从工作表继承锁定状态(默认)
Locked单元格被显式锁定——不可编辑
Unlocked单元格被显式解锁——始终可编辑

锁定单个单元格

// 锁定特定单元格
sheet.Cells["A1"].IsLocked = CellLock.Locked;

// 解锁特定单元格
sheet.Cells["B2"].IsLocked = CellLock.Unlocked;

// 重置为继承工作表设置
sheet.Cells["A1"].IsLocked = CellLock.Inherit;

锁定一个范围的单元格

要锁定多个单元格,可以遍历它们:

sheet.IterateCells("A1:D10", (row, col, cell) =>
{
    if (cell != null) cell.IsLocked = CellLock.Locked;
    return true; // 继续遍历
});

单元格只读属性

单个单元格还有一个 IsReadOnly 属性,提供更简单的只读标志:

sheet.Cells["A1"].IsReadOnly = true;

注意: 当正在编辑锁定的单元格时,将 IsLocked 设置为 Locked 会立即结束编辑会话。如果启用了 AlwaysMoveSelectionToUnlockedCell,选区也会移动到最近的未锁定单元格。

工作表级锁定

锁定或解锁整个工作表:

// 锁定整个工作表
sheet.IsLocked = true;

// 解锁整个工作表
sheet.IsLocked = false;

当工作表被锁定时:

  • IsLocked = CellLock.Inherit 的单元格变为锁定状态
  • IsLocked = CellLock.Unlocked 的单元格保持可编辑
  • 任何活跃的编辑会话都会立即结束

可选择锁定的单元格

默认情况下,锁定的单元格仍然可以被选中。要阻止选中锁定的单元格:

sheet.IsLockedCellSelectable = false;

移动选区到未锁定的单元格

以编程方式将选区移动到最近的未锁定单元格:

sheet.MoveSelectionRangeToUnlockedCell();

自动移动到未锁定的单元格

当工作表被锁定时,自动将选区移动到未锁定的单元格:

sheet.Options.AlwaysMoveSelectionToUnlockedCell = true;

工作簿级只读

将整个工作簿(所有工作表)设为只读模式:

// 使整个工作簿只读
reoGridControl.Readonly = true;

// 恢复为可写
reoGridControl.Readonly = false;

这会在所有工作表上设置 Edit_Readonly 工作表设置。

工作表只读设置

使用工作表设置使单个工作表只读:

// 使单个工作表只读
sheet.SetSettings(WorksheetSettings.Edit_Readonly, true);

// 检查是否为只读
bool isReadonly = sheet.HasSettings(WorksheetSettings.Edit_Readonly);

// 恢复为可写
sheet.SetSettings(WorksheetSettings.Edit_Readonly, false);

范围只读

通过范围实例使一组单元格只读:

var range = sheet.Ranges["A1:D10"];
range.IsReadonly = true;

自定义单元格主体与只读

自定义单元格主体(如按钮、复选框等)在其所属单元格为只读时会自动禁用。此行为由 DisableWhenCellReadonly 属性控制:

public class MyCustomCell : CellBody
{
    // 覆盖以在单元格只读时保持单元格主体仍然活跃
    public override bool DisableWhenCellReadonly => false;
}

异常处理

当代码尝试修改只读单元格时,ReoGrid 会抛出特定异常:

异常描述
OperationOnReadonlyCellException只读违规的基础异常
CellDataReadonlyException尝试修改只读单元格的数据(提供 CellPos
RangeContainsReadonlyCellsException对包含只读单元格的范围执行操作(提供 Range

处理这些异常:

try
{
    sheet["A1"] = "new value";
}
catch (CellDataReadonlyException ex)
{
    Console.WriteLine($"Cannot modify cell at {ex.CellPos}: cell is read-only");
}
catch (RangeContainsReadonlyCellsException ex)
{
    Console.WriteLine($"Range {ex.Range} contains read-only cells");
}

常用模式

带可编辑区域的模板

创建一个表单模板,其中只有特定单元格可编辑:

var sheet = grid.CurrentWorksheet;

// 设置带标签的模板
sheet["A1"] = "Name:";
sheet["A2"] = "Email:";
sheet["A3"] = "Phone:";

// 锁定标签单元格
sheet.Cells["A1"].IsLocked = CellLock.Locked;
sheet.Cells["A2"].IsLocked = CellLock.Locked;
sheet.Cells["A3"].IsLocked = CellLock.Locked;

// 显式解锁输入单元格
sheet.Cells["B1"].IsLocked = CellLock.Unlocked;
sheet.Cells["B2"].IsLocked = CellLock.Unlocked;
sheet.Cells["B3"].IsLocked = CellLock.Unlocked;

// 锁定工作表——只有 B1:B3 保持可编辑
sheet.IsLocked = true;

// 可选:自动移动到未锁定的单元格
sheet.Options.AlwaysMoveSelectionToUnlockedCell = true;

相关主题

这篇文章对您有帮助吗?