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;