入力規則は範囲に対して設定し、値がセルに確定される瞬間だけ評価されます。 描画のたびには走らないので、規則を張ったシートでもスクロールのコストは変わりません。

リスト
using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.Validation;
// 選択肢を直接指定する
ws.AddValidation(RangePosition.Parse("C2:C100"), new ListValidationRule
{
Options = ["東京", "大阪", "名古屋"],
});
// 別のセル範囲を参照する(同一シート・他シート・名前付き範囲のいずれでも可)
ws.AddValidation(RangePosition.Parse("D2:D100"), new ListValidationRule
{
Source = "=マスタ!$A$1:$A$20",
});
Source に書けるのは次のいずれかです。
| 書き方 | 例 |
|---|---|
| 同一シートのアドレス | $E$1:$E$9 / =$E$1:$E$9 |
| 名前付き範囲 | Colors |
| 他シート参照 | =マスタ!$A$1:$A$20 |
| リテラル(Excel が保存する形式) | "東京,大阪,名古屋" |
Options と Source の両方を指定した場合は Options が優先されます。
参照先の空セルは候補から除かれます。
ShowDropdown = false にすると矢印は描かれませんが、規則そのものは効いたままです
(Excel の「ドロップダウン リストから選択する」のチェックを外した状態と同じ)。
数値・日付・時刻・文字数
// 1〜100 の整数だけ
ws.AddValidation(RangePosition.Parse("B2:B100"), new ComparisonValidationRule
{
Kind = ComparisonKind.Whole,
Operator = ValidationOperator.Between,
Value1 = ValidationValue.Num(1),
Value2 = ValidationValue.Num(100),
});
// 今日以降の日付だけ(境界に数式を使う)
ws.AddValidation(RangePosition.Parse("E2:E100"), new ComparisonValidationRule
{
Kind = ComparisonKind.Date,
Operator = ValidationOperator.GreaterThanOrEqual,
Value1 = ValidationValue.Str("=TODAY()"),
});
// 8 文字以内
ws.AddValidation(RangePosition.Parse("F2:F100"), new ComparisonValidationRule
{
Kind = ComparisonKind.TextLength,
Operator = ValidationOperator.LessThanOrEqual,
Value1 = ValidationValue.Num(8),
});
ComparisonKind は 5 種類です。
| 種別 | 比較の対象 |
|---|---|
Whole | 数値。小数部があると不合格 |
Decimal | 数値 |
Date | シリアル値(2026-04-01 のような文字列も解釈する) |
Time | 一日を 1 とした小数(13:30 → 0.5625) |
TextLength | 入力文字数 |
ValidationOperator は Excel と同じ 8 種類 —
Between NotBetween Equal NotEqual GreaterThan LessThan
GreaterThanOrEqual LessThanOrEqual。Value2 は Between / NotBetween のときだけ使われます。
境界(Value1 / Value2)には数値のほか、= で始まる数式と、その種別として解釈できる
文字列リテラル("2026-04-01"、"09:00")を渡せます。数式はセルを参照でき、
参照先が変われば規則の意味も変わります。
独自数式
// 数式は範囲の左上セルを基準に書く。相対参照は行・列のオフセット分だけずれる
ws.AddValidation(RangePosition.Parse("A2:A100"), new CustomValidationRule
{
Formula = "=COUNTIF($A$2:$A$100, A2)=1", // 重複禁止
});
数式が真を返せば合格です。相対参照のずれ方は条件付き書式の expression ルールと同じで、
$ を付けた参照は固定されます。数式はシートの数式エンジンで評価されるので、
クロスシート参照も名前付き範囲も使えます。
メッセージと警告レベル
ws.AddValidation(RangePosition.Parse("B2:B100"), new ComparisonValidationRule
{
Kind = ComparisonKind.Decimal,
Operator = ValidationOperator.GreaterThanOrEqual,
Value1 = ValidationValue.Num(0),
// 選択中に出る案内
ShowInputMessage = true,
InputTitle = "金額",
InputMessage = "0 以上で入力してください。",
// 弾いたときの警告。Stop だけが入力をブロックする
AlertStyle = ValidationAlertStyle.Warning,
ErrorTitle = "マイナス値",
ErrorMessage = "マイナスの金額が入力されています。",
IgnoreBlank = true,
});
AlertStyle | 動作 |
|---|---|
Stop(既定) | 入力を拒否する。エディタは開いたままで、値を直せる |
Warning | 「このまま入力しますか?」と尋ね、答えに従う |
Information | 知らせるだけで、入力は通る |
IgnoreBlank(既定 true)が立っていれば空入力は常に合格します。
ShowErrorMessage = false にすると警告は出ませんが、Stop の拒否そのものは変わりません。
いつ評価されるか
- セル編集の確定と数式バーからの確定 — この 2 つだけです。
- 数式(
=で始まる入力)は検査しません。 確定時には結果が定まらないため、Excel も同じ扱いです。 - 貼り付け・オートフィル・API からの
SetValueは検査しません。 これも Excel と同じで、 規則は「人が打った値」に対する門番です。
自分で検査する
// 入力候補(リスト規則のみ。ドロップダウンを出さない設定なら空)
IReadOnlyList<string> options = ws.GetValidationListOptions(1, 2);
// コミット前に自分で検査する(コントロールは編集確定時にこれを呼んでいる)
ValidationResult result = ws.ValidateInput(1, 1, "-5");
if (!result.IsValid && result.Blocks)
{
string? title = result.Title;
string? message = result.Message;
_ = (title, message);
}
ValidationRule? rule = ws.GetValidation(1, 1);
_ = (options, rule);
解除
string id = ws.AddValidation(RangePosition.Parse("B2:B100"), new AnyValidationRule());
// id で 1 つ消す
ws.RemoveValidation(id);
// 選択範囲だけ解除する。範囲からはみ出す規則は分割され、外側は残る
ws.ClearValidations(RangePosition.Parse("B10:B20"));
bool any = ws.HasValidations;
_ = any;
AnyValidationRule は「何でも可」の規則です。入力は拒否しませんが、
ShowInputMessage と組み合わせると案内だけを出すセルが作れます。
コントロール側の振る舞い
- 選択セルにリスト規則があると、セルの右外側にドロップダウンの矢印が描かれます (Excel と同じ位置。セル自身の文字を隠しません)。クリックか Alt+↓ で開きます。
ShowInputMessageの案内はセルの下に吹き出しで出ます。- 印刷・PDF には出ません(
GridViewport.ShowValidationUIが false)。 - 弾かれたときは、まず
CellValidationFailedイベントが上がります。Handledを立てれば独自のダイアログに差し替えられ、Rejectで採否も上書きできます。 未処理なら WinForms / WPF は Excel と同じメッセージボックスを出します。 Avalonia には標準のモーダルが無いため、グリッド内に一時メッセージを描いて知らせます。
Undo と I/O
- 規則の追加・解除は
RangeFacets.Validationsで undo に載ります。行・列の挿入削除を undo すると、規則の範囲も元に戻ります。 - reogrid-json:シートの
validationsとして保存され、reogrid-web と同じ形です。 - XLSX:
<dataValidations>として読み書きします。sqrefが複数範囲を持つ場合は 範囲ごとのエントリに展開されます。Excel のshowDropDownは「矢印を隠す」意味の 反転属性で、その差はここで吸収しています。
Studio で試す
Data ▸ Data Validation… でダイアログが開きます(選択範囲に適用)。
Data ▸ Clear Validation で選択範囲だけ解除できます。