データバリデーション
ReoGridは、ユーザーがセルを編集している間に無効な入力をブロックできます。IValidator をセルまたは範囲にアタッチして、ルールに合格しない文字や最終テキストを拒否します。
実行タイミング
- 編集中の入力時(文字ごと)に
IValidator.IsValidCharが実行されます。 - 編集テキストが変更されたとき、または編集が終了したときに
IValidator.Validateが実行されます。 - バリデーションが設定されたセルまたは範囲にデータをコピーするとき(ターゲットのバリデーターが入力テキストを受け入れる必要があります)。
バリデーションが失敗すると、キーストロークまたは編集がキャンセルされ、セルは以前の値を保持します。ReoGridは組み込みのメッセージを表示しません。必要に応じて独自のメッセージを表示してください(例:バリデーターまたはUI経由)。
バリデーターの適用
using unvell.ReoGrid.Edit;
var sheet = grid.CurrentWorksheet;
// Apply to a range (all cells share the validator instance)
sheet.Ranges["C1:C20"].Validator = new NumericValidator(); // digits, '-' or '.'
// Clear validation
sheet.Ranges["C1:C20"].Validator = null;
組み込み数値バリデーター
NumericValidator はデフォルトで数字、マイナス記号、小数点を受け付けます。数値として認識する内容を変更するには、正規表現パターンを渡します:
// allow digits only
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; }
}
// Apply
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; // optionally override and allow
}
else
{
ShowStatus("OK");
}
};
編集イベント(CellEditTextChanging / CellEditCharInputed)で簡単なインラインチェックを実行することもできます。シンプルなシナリオについてはセル編集を参照してください。