当用户双击或按 F2 时,单元格进入编辑模式。ReoGrid 在单元格上方覆盖一个文本框来捕获输入。

命名空间
using unvell.ReoGrid;
开始编辑
使用工作表上的 StartEdit 方法开始编辑单元格。如果另一个单元格已在编辑模式中,ReoGrid 会先结束该编辑会话。
// 编辑当前选中的单元格
sheet.StartEdit();
// 使用初始文本编辑选中的单元格
sheet.StartEdit("initial text");
// 按位置编辑
sheet.StartEdit(new CellPosition("A1"));
sheet.StartEdit(new CellPosition("A1"), "initial text");
// 按行列索引编辑
sheet.StartEdit(2, 3);
sheet.StartEdit(2, 3, "initial text");
StartEdit 重载
| 签名 | 说明 |
|---|---|
StartEdit() | 编辑当前选中的单元格 |
StartEdit(string newText) | 使用在编辑框中显示的初始文本编辑选中的单元格 |
StartEdit(CellPosition pos) | 编辑指定位置的单元格 |
StartEdit(CellPosition pos, string newText) | 使用初始文本编辑指定位置的单元格 |
StartEdit(int row, int col) | 编辑指定行列索引的单元格 |
StartEdit(int row, int col, string newText) | 使用初始文本编辑指定行列的单元格 |
所有重载返回 bool — 如果成功进入编辑模式则为 true,否则为 false(例如单元格为只读或 BeforeCellEdit 被取消)。
从单元格实例开始编辑
var cell = sheet.Cells["A1"];
cell.StartEdit();
结束编辑
使用 EndEdit 完成编辑。EndEditReason 控制更改是提交还是丢弃。
// 正常结束编辑(提交更改)
sheet.EndEdit();
sheet.EndEdit(EndEditReason.NormalFinish);
// 取消编辑(丢弃更改)
sheet.EndEdit(EndEditReason.Cancel);
// 使用自定义数据结束编辑(覆盖用户输入)
sheet.EndEdit("Override Value");
sheet.EndEdit("Override Value", EndEditReason.NormalFinish);
EndEdit 重载
| 签名 | 说明 |
|---|---|
EndEdit(EndEditReason reason = EndEditReason.NormalFinish) | 使用指定原因结束编辑 |
EndEdit(object data) | 使用自定义数据代替用户输入的文本结束编辑 |
EndEdit(object data, EndEditReason reason) | 使用自定义数据和指定原因结束编辑 |
所有重载返回 bool — 如果工作表处于编辑模式且操作成功完成则为 true。
从单元格实例结束编辑
var cell = sheet.Cells["A1"];
cell.EndEdit("new data");
EndEditReason 枚举
| 值 | 说明 |
|---|---|
NormalFinish | 用户正常完成编辑(回车、Tab、点击其他位置)。更改被提交。 |
Cancel | 用户取消编辑(Escape)。更改被丢弃。 |
编辑状态属性
// 检查是否有单元格正在编辑
bool isEditing = sheet.IsEditing;
// 获取当前正在编辑的单元格(未编辑时为 null)
Cell editingCell = sheet.EditingCell;
// 获取或设置编辑文本框中的当前文本
string editText = sheet.CellEditText;
sheet.CellEditText = "modified text";
| 属性 | 类型 | 说明 |
|---|---|---|
IsEditing | bool | 是否有单元格当前处于编辑模式(只读) |
EditingCell | Cell | 当前正在编辑的单元格,或 null(只读) |
CellEditText | string | 编辑文本框中的当前文本(可读写) |
只读单元格
阻止单个单元格的编辑:
var cell = sheet.Cells["A1"];
cell.IsReadOnly = true;
使整个工作表只读:
sheet.SetSettings(WorksheetSettings.Edit_Readonly, true);
详见 保护与锁定 了解完整的保护选项。
输入行为设置
// 禁用输入后的自动数据格式化
sheet.SetSettings(WorksheetSettings.Edit_AutoFormatCell, false);
// 禁用友好的百分比辅助功能(在编辑时追加 %)
sheet.SetSettings(WorksheetSettings.Edit_FriendlyPercentInput, false);
// 禁用字体大小增大时自动调整行高
sheet.SetSettings(WorksheetSettings.Edit_AutoAdjustRowHeight, false);
详见 设置 了解所有工作表设置。
事件
ReoGrid 在编辑模式前、中、后触发事件。您可以取消编辑、验证文本或转换用户输入。

BeforeCellEdit
在编辑框出现之前触发。设置 IsCancelled = true 可以阻止编辑。
sheet.BeforeCellEdit += (s, e) =>
{
// 阻止特定单元格的编辑
if (e.Cell.Column == 0)
e.IsCancelled = true;
// 更改编辑框中显示的初始文本
e.EditText = "default value";
};
CellBeforeEditEventArgs 属性:
| 属性 | 类型 | 说明 |
|---|---|---|
Cell | Cell | 即将被编辑的单元格 |
IsCancelled | bool | 设置为 true 以阻止编辑 |
EditText | string | 编辑框中显示的文本(可修改) |
CellEditTextChanging
当编辑文本发生变化时触发(输入、粘贴或 IME 输入)。用于在编辑过程中替换或验证文本。
sheet.CellEditTextChanging += (s, e) =>
{
// 将特定输入替换为预定义数据
if (e.Text.Equals("specific input"))
{
e.Text = "predefined data";
}
};
CellEditTextChangingEventArgs 属性:
| 属性 | 类型 | 说明 |
|---|---|---|
Cell | Cell | 正在编辑的单元格 |
Text | string | 当前编辑文本(可修改 — 设置以替换) |
CellEditCharInputed
每输入一个字符时触发。提供字符和光标位置的详细信息。
sheet.CellEditCharInputed += (s, e) =>
{
Console.WriteLine($"Char: {(char)e.InputChar}, Position: {e.CaretPositionInLine}");
};
注意: 在 WPF 中,此事件不支持字符替换。请改用
CellEditTextChanging。 CellEditCharInputEventArgs 属性:
| 属性 | 类型 | 说明 |
|---|---|---|
Cell | Cell | 正在编辑的单元格 |
InputChar | int | 输入字符代码(可修改) |
CaretPositionInLine | int | 当前行内的光标位置(只读) |
LineIndex | int | 编辑文本中的行索引(只读) |
InputText | string | 当前完整的编辑文本(只读) |
AfterCellEdit
用户完成编辑后触发。您可以修改结果数据、更改格式或取消编辑以恢复。
sheet.AfterCellEdit += (s, e) =>
{
// 覆盖数据
e.NewData = ProcessInput(e.NewData);
// 更改新数据的数据格式
e.DataFormat = CellDataFormatFlag.Number;
// 或取消以恢复原始值
// e.EndReason = EndEditReason.Cancel;
};
CellAfterEditEventArgs 属性:
| 属性 | 类型 | 说明 |
|---|---|---|
Cell | Cell | 已编辑的单元格 |
NewData | object | 新数据值(可修改 — 设置以覆盖用户输入) |
EndReason | EndEditReason | 编辑结束原因(可修改 — 设置为 Cancel 以恢复) |
DataFormat | CellDataFormatFlag | 应用于新数据的数据格式(可修改) |
CellValidation
在对编辑文本执行验证后触发。提供验证结果并允许覆盖有效/无效状态。
sheet.CellValidation += (s, e) =>
{
if (!e.IsValid)
{
Console.WriteLine($"Validation failed: {e.Failures.Count} failure(s)");
}
// 覆盖验证结果
e.IsValid = true;
};
CellValidationEventArgs 属性:
| 属性 | 类型 | 说明 |
|---|---|---|
Cell | Cell | 正在验证的单元格 |
Failures | IList<IValidationFailure> | 验证失败列表(null 或空表示有效) |
IsValid | bool | 输入是否有效(可修改 — 设置以覆盖) |
详见 数据验证 了解如何设置验证规则。
CellDataChanged
当单元格数据实际发生变化时触发 — 包括用户编辑和程序化更新(如 SetCellData、粘贴)。这是观察数据变化的最终钩子。
sheet.CellDataChanged += (s, e) =>
{
Console.WriteLine($"Cell {e.Cell.Address} changed to: {e.Cell.Data}");
};
注意: 当用户按 Escape 取消编辑时,
CellDataChanged不会触发。它对交互式和程序化数据更改都会触发。
常见模式
限制编辑范围
var editableRange = new RangePosition(3, 1, 2, 3);
sheet.SetRangeBorders(editableRange, BorderPositions.Outside, RangeBorderStyle.BlackSolid);
sheet[2, 1] = "Edit only allowed in this range:";
sheet.BeforeCellEdit += (s, e) =>
e.IsCancelled = !editableRange.Contains(e.Cell.Position);

自动大写输入
sheet.CellEditTextChanging += (s, e) =>
{
e.Text = e.Text.ToUpper();
};
验证并拒绝无效输入
sheet.AfterCellEdit += (s, e) =>
{
if (e.Cell.Column == 2 && !int.TryParse(e.NewData?.ToString(), out _))
{
e.EndReason = EndEditReason.Cancel; // 恢复原始值
}
};