数据验证

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)中执行快速的内联检查,用于简单场景——参见单元格编辑

这篇文章对您有帮助吗?