数据验证
ReoGrid 可以在用户编辑单元格时阻止无效输入。将 IValidator 附加到单元格或范围,以拒绝不符合规则的字符和最终文本。
运行时机
- 在编辑输入期间(逐字符)通过
IValidator.IsValidChar。 - 在编辑文本更改或完成时通过
IValidator.Validate。 - 在将数据复制到已验证的单元格或范围时(目标的验证器必须接受传入的文本)。
如果验证失败,按键或编辑将被取消,单元格保持其先前的值。ReoGrid 不显示内置消息;如果需要,请自行提供(例如通过验证器或 UI)。
应用验证器
using unvell.ReoGrid.Edit;
var sheet = grid.CurrentWorksheet;
// 应用到范围(所有单元格共享验证器实例)
sheet.Ranges["C1:C20"].Validator = new NumericValidator(); // 数字、'-' 或 '.'
// 清除验证
sheet.Ranges["C1:C20"].Validator = null;
内置数值验证器
NumericValidator 默认接受数字、减号和小数点。传入正则表达式模式可以更改数值的判定规则:
// 仅允许数字
sheet.Ranges["D1:D50"].Validator = new NumericValidator("^[0-9]+$");
创建自定义验证器
实现 IValidator 以定义您自己的规则(长度、白名单、正则表达式等)。
using System.Collections.Generic;
using System.Text.RegularExpressions;
using unvell.ReoGrid.Edit;
class UppercaseValidator : IValidator
{
private readonly Regex pattern = new Regex("^[A-Z]*$");
public bool IsValidChar(string text) => pattern.IsMatch(text);
public IList<IValidationFailure> Validate(string text)
{
if (pattern.IsMatch(text)) return null;
return new List<IValidationFailure> { new SimpleFailure("Uppercase letters only") };
}
}
class SimpleFailure : IValidationFailure
{
public string Message { get; }
public SimpleFailure(string message) { Message = message; }
}
// 应用
sheet.Ranges["A1:A100"].Validator = new UppercaseValidator();
提示
- 保持验证器快速运行——方法在每次按键时都会执行。
- 如果要显示消息,请在您的 UI 中处理验证失败(例如订阅编辑事件并检查验证器)。
- 验证针对用户编辑和复制/粘贴到已验证单元格时强制执行;通过代码编程赋值的值应已经是正确的。
监听验证状态
ReoGrid 在每次验证器运行时触发 Worksheet.CellValidation。使用它来显示”OK/NG”状态或自定义消息:
sheet.CellValidation += (s, e) =>
{
if (!e.IsValid)
{
var msg = string.Join("\n", e.Failures?.Select(f => f.Message) ?? Array.Empty<string>());
ShowStatus($"Validation failed at {e.Cell?.Position}: {msg}");
// e.IsValid = true; // 可选择覆盖并允许
}
else
{
ShowStatus("OK");
}
};
您也可以在编辑事件(CellEditTextChanging / CellEditCharInputed)中执行快速的内联检查,用于简单场景——参见单元格编辑。