V4 V5

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

リスト規則を設定した列。選択セルの右にドロップダウンが出て、入力時メッセージが表示される

リスト

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 が保存する形式)"東京,大阪,名古屋"

OptionsSource の両方を指定した場合は 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 LessThanOrEqualValue2Between / 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 で選択範囲だけ解除できます。

ページの内容は役に立ちましたか?