セル型は、セルの描画とクリック時の振る舞いを差し替える仕組みです。 チェックボックス、ドロップダウン、進捗バーなどを表現します。

記述子は共有される
V4 はセルごとに「body」インスタンスを代入していたため、セル数ぶんの実体ができました。 V5 はフライウェイトな記述子を範囲に割り当てます。
using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.CellTypes;
// 範囲に割り当てる — 100 万行のチェックボックス列でもエントリは 1 個
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 個と共有記述子 1 個です。
状態はセル値に持つ
記述子は状態を持ちません。チェックの有無も選択値も進捗率も、通常のセル値です。
// 状態はセル値。記述子は共有され、状態を持たない
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)でチェック数を数えられます - 保存が単純。 値は値、型は型として別々に往復します
- ソート・フィルタが効く。 セル型を意識した特別扱いが要りません
描画は可視範囲のみ
セル型の描画とクリック判定は可視セルに対してのみ行われます。範囲がどれだけ大きくても、 コストは画面に映っている数に比例します。
割り当てを確認する
CellTypeDescriptor? type = ws.GetCellType(0, 0);
if (type != null)
Console.WriteLine(type.TypeName);
int entries = ws.CellTypes.Count; // 範囲エントリの数(セル数ではない)
bool any = ws.HasCellTypes;
ws.CellTypes.Count は範囲エントリの数であり、セル型が付いたセルの数ではありません。
UI 層との分担
コアは UI に依存しないため、記述子は抽象的な結果を返すだけです。
| 記述子が返すもの | コントロールが実体化するもの |
|---|---|
SetValue | セル値の更新 |
OpenDropdown | ドロップダウンのポップアップ表示 |
Navigate | 既定のブラウザでリンクを開く |
RaiseButton | CellButtonClicked イベントの発火 |
ボタンのクリックは、V4 のような記述子ごとのイベントではなく
コントロールの CellButtonClicked で受けます。
構造変更への追従
行や列を挿入・削除すると、割り当て範囲は自動的に追従します。
次に読む
- 組込のセル型
- カスタムセル型