V4 V5

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

B3:C7 を選択した状態。アクティブセルは B3 で、選択範囲の中で白く残る

取得と移動

メンバー内容
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) は移動先を計算するだけのメソッドで、 独自のキーバインドを実装する場合に使えます。

次に読む

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