セル型を割り当てると、そのセルは文字列の代わりにチェックボックスやドロップダウンとして 表示され、クリックに反応するようになります。入力フォームや進捗表を、独自のコントロールを 作らずにシート上で組み立てられます。

用意されているのは 6 種類です。詳細は 組込のセル型 を参照してください。
| セル型 | 見た目 | 値 |
|---|---|---|
| チェックボックス | チェックボックス | bool |
| ドロップダウン | 選択リスト | string |
| 進捗バー | 塗りつぶしバー | double |
| ボタン | 押しボタン | string(ラベル) |
| ハイパーリンク | リンク文字 | string(URL) |
| スパークライン | セル内の折れ線 | string(カンマ区切りの数値) |
割り当てる
セル単位でも範囲単位でも割り当てられます。
using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.CellTypes;
// 列全体にまとめて割り当てられる。範囲が広くてもコストは変わらない
ws.SetCellType(RangePosition.Parse("A1:A1048576"), CheckboxCellType.Instance);
// 単一セル
ws.SetCellType(2, 1, CheckboxCellType.Instance);
ws.Cell("C3").SetCellType(new ProgressCellType(max: 100));
ws.SetCellType(2, 1, null); // 解除
列全体への割り当てをためらう必要はありません。 「チェック列」「ステータス列」のように 列ごとセル型を決める使い方が想定された作りになっており、104 万行を指定してもメモリ使用量も 処理時間も 1 セルの場合と変わりません。描画とクリック判定は画面に映っているセルにだけ 行われます。
行や列を挿入・削除すると、割り当て範囲は自動的に追従します。
値を入れる
セル型が決めるのは見た目と操作だけです。チェックの有無も選択値も進捗率も、
SetBoolean / SetText / SetNumber で入れる通常のセル値です。
// セル型は見た目と操作を決めるだけ。値は通常のセル値として持つ
ws.SetCellType(0, 0, CheckboxCellType.Instance);
ws.SetBoolean(0, 0, true); // チェック済み
ws.SetCellType(1, 0, new DropdownCellType(["A", "B"]));
ws.SetText(1, 0, "B"); // 選択値
ws.SetCellType(2, 0, new ProgressCellType(max: 100));
ws.SetNumber(2, 0, 65); // 進捗 65%
普通のセル値なので、シートの他の機能がそのまま使えます。
- 数式で集計できる。
COUNTIF(A:A, TRUE)でチェックの数を数えられます - ソート・フィルタが効く。 セル型を意識した特別な扱いは要りません
- 保存・読み込みで往復する。 値とセル型はそれぞれ別に保存されます
セル型を外しても値は残ります。SetCellType(r, c, null) の後は、チェックボックスだった
セルが TRUE / FALSE の文字として表示されます。
クリックに応える
チェックボックスとドロップダウンと進捗バーは、コントロールが自分で処理します。 アプリ側で書くコードはありません。
- チェックボックス — クリックで
true/falseが反転し、セル値が書き換わります - ドロップダウン — クリックでリストが開き、選んだ文字列がセル値になります
- ハイパーリンク — クリックで既定のブラウザが開きます
アプリ側で処理が要るのはボタンだけです。コントロールの CellButtonClicked を受けます。
control.CellButtonClicked += (s, e) =>
{
// e.Cell にクリックされたセルの位置が入る
Console.WriteLine($"{e.Cell.Row},{e.Cell.Col}");
};
このイベントは WinForms / WPF / Avalonia の 3 つとも同じ名前です。
ヘッドレス(コントロールを持たない)で使う場合、これらの操作は発生しません。 値の読み書きだけが行われます。
割り当てを確認する
CellTypeDescriptor? type = ws.GetCellType(0, 0);
if (type != null)
Console.WriteLine(type.TypeName);
int entries = ws.CellTypes.Count; // 割り当てた範囲の数(セル数ではない)
bool any = ws.HasCellTypes;
GetCellType はそのセルに効いているセル型を返します。何も割り当てられていなければ null です。
ws.CellTypes.Count が返すのは割り当てを行った範囲の数であり、セル型が付いたセルの数では
ありません。列全体に 1 回割り当てたなら 1 です。
保存
セル型は reogrid-json に往復します。XLSX には対応する概念がないため、XLSX として 書き出すと値だけが残り、セル型は失われます。
ドロップダウンを XLSX に持ち出したい場合は、セル型ではなく
データの入力規則のリストを使ってください。こちらは
<dataValidations> として往復するため、Excel でもドロップダウンとして機能します。
独自のセル型
6 種類で足りない場合は自分で作れます。日付ピッカー、星による評価、色見本など、 描画とクリックの反応を自分で書けば同じように扱えます。
詳細は カスタムセル型 を参照してください。