選択状態はビュー側が持ちます。Worksheet は選択を知りません。

取得と移動
| メンバー | 内容 |
|---|---|
control.Selection | 選択範囲(RangePosition・取得のみ)。複数領域ならアクティブ領域 |
control.SelectionAreas | 選択されている全領域(IReadOnlyList<RangePosition>)。末尾がアクティブ領域 |
control.ActiveCell | アクティブセル(CellPosition・取得のみ) |
control.MoveTo(row, col) | アクティブセルを移動し、選択を単一セルにする |
control.SelectionChanged | 選択が変わったときのイベント |
ビューポートを直接扱う場合は viewport.Selection / viewport.ActiveCell /
viewport.SetActiveCell(r, c) / viewport.ExtendSelectionTo(r, c) /
viewport.SelectColumn(col) です。
using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.Rendering;
viewport.SetActiveCell(2, 1); // B3 をアクティブに(選択も B3 単独になる)
viewport.ExtendSelectionTo(6, 2); // B3:C7 へ広げる
RangePosition selection = viewport.Selection;
CellPosition active = viewport.ActiveCell;
viewport.SelectColumn(3); // D 列全体
viewport.SelectRow(0); // 1 行目全体
viewport.SelectAll();
// 行・列すべてが選ばれているかは、範囲を見なくても判定できる
bool wholeColumns = viewport.SelectionIsWholeColumns;
複数範囲選択(非連続選択)
Ctrl+クリック(macOS では ⌘+クリック)で領域を追加できます。Excel の “multiple selection” と同じで、選択は 1 つの矩形ではなく矩形のリストです。
| 操作 | 結果 |
|---|---|
| クリック / Ctrl+A / 矢印キー | 1 領域に戻る |
| Ctrl(⌘)+クリック・ドラッグ | 領域を追加し、それがアクティブ領域になる |
| Ctrl(⌘)+クリック(行・列ヘッダー) | その行・列を丸ごと領域として追加 |
| Shift+クリック / Shift+矢印 | アクティブ領域だけを伸ばす(他の領域は残る) |
macOS で ⌘ を使うのは慣習の問題だけではありません。macOS は Ctrl+クリックを 右クリックとして扱うため、Ctrl のままではコンテキストメニューと衝突します。 このコマンド修飾キーの規約(Windows/Linux は Ctrl、macOS は ⌘)は、セルエディタや Ctrl(⌘)+矢印のデータ端ジャンプと共通です。
アクティブセルは常にアクティブ領域の中にあり、フィルハンドルもそこに出ます。
using unvell.ReoGrid.Core;
using unvell.ReoGrid.Core.Rendering;
viewport.SetActiveCell(0, 0); // A1
viewport.ExtendSelectionTo(2, 1); // A1:B3 — 1 つ目の領域
viewport.AddSelectionArea(0, 4); // E1 に 2 つ目の領域を開く(Ctrl+クリック相当)
viewport.ExtendSelectionTo(2, 5); // E1:F3 へ広げる(伸びるのはアクティブ領域だけ)
viewport.AddColumnSelectionArea(7); // H 列を丸ごと 3 つ目の領域に
var areas = viewport.SelectionAreas; // 末尾がアクティブ領域
bool many = viewport.HasMultipleAreas;
long cells = viewport.SelectionCellCount;
bool inside = viewport.SelectionContains(1, 5); // どの領域かは問わない
// 代入すると 1 領域に畳む(通常クリック・貼り付け・検索ヒットが通る道)
viewport.Selection = new RangePosition(0, 0, 1, 1);
領域どうしが重なっていても、一括操作は共有セルを 1 回しか処理しません
(RangeSet.Disjoint が互いに素な矩形へ正規化します)。「インデントを 1 増やす」の
ような相対的な変換が二重に効くことはありません。
選択範囲への一括操作
コントロールに選択範囲を対象とするヘルパが揃っています。いずれも選択されている全領域に 効き、複数領域でも 1 回の Ctrl+Z で元に戻ります。行・列全体が選択されている場合は 自動的に行・列の既定スタイルへ振り分けられるため、104 万セルを走査することはありません。
書式
| メンバー |
|---|
ToggleSelectionBold() / ToggleSelectionItalic() / ToggleSelectionUnderline() |
SetSelectionTextColor(color) / SetSelectionBackColor(color) |
SetSelectionFontFamily(family) / SetSelectionFontSize(size) |
SetSelectionHAlign(align) / SetSelectionVAlign(align) / SetSelectionWrap(wrap) |
SetSelectionNumberFormat(format) |
MutateSelectionStyle(s => s with { ... }) — 任意の変換 |
構造
| メンバー |
|---|
MergeSelection() / UnmergeSelection() — 結合は領域ごとに 1 つ(外接矩形をまとめて結合はしない) |
SetSelectionOutline(color, width) / SetSelectionAllBorders(color, width) / ClearSelectionBorders() |
InsertRowsAtSelection() / DeleteSelectedRows() |
InsertColumnsAtSelection() / DeleteSelectedColumns() |
SetSelectedRowHeight(h) / SetSelectedColumnWidth(w) |
AutoFitSelectedColumns() / AutoFitSelectedRows() |
SetSelectionCellType(type) |
クリップボード
CopySelection() / CutSelection() / PasteClipboard()
クリップボードは矩形なので、複数領域のコピーは1 ブロックに詰められるときだけ通ります (同じ列を共有して縦に積む/同じ行を共有して横に並ぶ)。詰められない組み合わせは Excel と 同じ文言で断ります。詳しくはクリップボードを参照してください。
モデルが選択を持たない理由
V4 は worksheet.SelectionRange としてモデル側に持っていました。V5 で分離したのは、
同じワークシートを複数のビューから見る構成と、ヘッドレス実行を素直に扱うためです。
その帰結として、選択範囲はファイルに保存されません。
キーボード操作
矢印キー、Shift + 矢印での範囲拡張、Ctrl + 矢印でのジャンプ、Home / End、 Page Up / Down が既定で配線されています。
viewport.StepTarget(dRow, dCol) は移動先を計算するだけのメソッドで、
独自のキーバインドを実装する場合に使えます。