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

Styled Spreadsheet

命名空间

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";
属性类型说明
IsEditingbool是否有单元格当前处于编辑模式(只读)
EditingCellCell当前正在编辑的单元格,或 null(只读)
CellEditTextstring编辑文本框中的当前文本(可读写)

只读单元格

阻止单个单元格的编辑:

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 在编辑模式前、中、后触发事件。您可以取消编辑、验证文本或转换用户输入。

150

BeforeCellEdit

在编辑框出现之前触发。设置 IsCancelled = true 可以阻止编辑。

sheet.BeforeCellEdit += (s, e) =>
{
    // 阻止特定单元格的编辑
    if (e.Cell.Column == 0)
        e.IsCancelled = true;

    // 更改编辑框中显示的初始文本
    e.EditText = "default value";
};

CellBeforeEditEventArgs 属性:

属性类型说明
CellCell即将被编辑的单元格
IsCancelledbool设置为 true 以阻止编辑
EditTextstring编辑框中显示的文本(可修改)

CellEditTextChanging

当编辑文本发生变化时触发(输入、粘贴或 IME 输入)。用于在编辑过程中替换或验证文本。

sheet.CellEditTextChanging += (s, e) =>
{
    // 将特定输入替换为预定义数据
    if (e.Text.Equals("specific input"))
    {
        e.Text = "predefined data";
    }
};

CellEditTextChangingEventArgs 属性:

属性类型说明
CellCell正在编辑的单元格
Textstring当前编辑文本(可修改 — 设置以替换)

CellEditCharInputed

每输入一个字符时触发。提供字符和光标位置的详细信息。

sheet.CellEditCharInputed += (s, e) =>
{
    Console.WriteLine($"Char: {(char)e.InputChar}, Position: {e.CaretPositionInLine}");
};

注意: 在 WPF 中,此事件不支持字符替换。请改用 CellEditTextChangingCellEditCharInputEventArgs 属性:

属性类型说明
CellCell正在编辑的单元格
InputCharint输入字符代码(可修改)
CaretPositionInLineint当前行内的光标位置(只读)
LineIndexint编辑文本中的行索引(只读)
InputTextstring当前完整的编辑文本(只读)

AfterCellEdit

用户完成编辑后触发。您可以修改结果数据、更改格式或取消编辑以恢复。

sheet.AfterCellEdit += (s, e) =>
{
    // 覆盖数据
    e.NewData = ProcessInput(e.NewData);

    // 更改新数据的数据格式
    e.DataFormat = CellDataFormatFlag.Number;

    // 或取消以恢复原始值
    // e.EndReason = EndEditReason.Cancel;
};

CellAfterEditEventArgs 属性:

属性类型说明
CellCell已编辑的单元格
NewDataobject新数据值(可修改 — 设置以覆盖用户输入)
EndReasonEndEditReason编辑结束原因(可修改 — 设置为 Cancel 以恢复)
DataFormatCellDataFormatFlag应用于新数据的数据格式(可修改)

CellValidation

在对编辑文本执行验证后触发。提供验证结果并允许覆盖有效/无效状态。

sheet.CellValidation += (s, e) =>
{
    if (!e.IsValid)
    {
        Console.WriteLine($"Validation failed: {e.Failures.Count} failure(s)");
    }

    // 覆盖验证结果
    e.IsValid = true;
};

CellValidationEventArgs 属性:

属性类型说明
CellCell正在验证的单元格
FailuresIList<IValidationFailure>验证失败列表(null 或空表示有效)
IsValidbool输入是否有效(可修改 — 设置以覆盖)

详见 数据验证 了解如何设置验证规则。

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);

41

自动大写输入

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;  // 恢复原始值
    }
};

相关主题

这篇文章对您有帮助吗?