コントロールは Excel に準じたキー操作とマウス操作を最初から持っています。 配線のためのコードは要りません。
キー操作
移動と選択
| キー | 動作 |
|---|---|
| ← ↑ → ↓ | アクティブセルを 1 つ動かす |
| Shift + 矢印 | 選択範囲を広げる |
| Tab / Shift+Tab | 右へ / 左へ |
| Enter / Shift+Enter | 下へ / 上へ |
| Home | 行頭(A 列)へ |
| Ctrl + Home | A1 へ |
| PageDown / PageUp | 1 画面ぶん下 / 上 |
| Shift + PageDown / PageUp | 1 画面ぶん選択を広げる |
編集
| キー | 動作 |
|---|---|
| F2 | セルの編集を開始する |
| 文字キー | その文字で置き換えて編集を開始する |
| Delete / BackSpace | アクティブセルの内容を消す |
| Esc | 編集を取り消す |
| Enter | 編集を確定して下へ |
書式・履歴・クリップボード
| キー | 動作 |
|---|---|
| Ctrl + B / I / U | 太字 / 斜体 / 下線(編集中は選択文字、非編集中は選択セル) |
| Ctrl + C / X / V | コピー / 切り取り / 貼り付け |
| Ctrl + Z | 元に戻す |
| Ctrl + Shift + Z / Ctrl + Y | やり直す |
Ctrl+B などは、編集中かどうかで対象が変わります。セル編集中なら選択した文字だけに、 そうでなければ選択セル全体に効きます(リッチテキスト)。
マウス操作
| 操作 | 動作 |
|---|---|
| クリック | セルを選択 |
| ドラッグ | 範囲を選択 |
| ダブルクリック | セルの編集を開始 |
| 行・列ヘッダーをクリック | 行・列全体を選択 |
| 左上のコーナーをクリック | シート全体を選択 |
| ヘッダーの境界をドラッグ | 行の高さ・列の幅を変える |
| ヘッダーの境界をダブルクリック | 内容に合わせて自動調整(AutoFit) |
| 選択範囲右下のつまみをドラッグ | オートフィル |
| ホイール | 縦スクロール |
| Ctrl + ホイール | 表示倍率を 10% 刻みで変更 |
| 右クリック | ContextMenuRequested を発火 |
ヘッダーの ▽ をクリック | オートフィルタのパネルを開く |
アウトライン欄の + / − | グループの展開・折りたたみ |
複数の行(または列)を選択した状態でその中の境界をドラッグすると、 選択したすべての行・列の大きさが同時に変わります。
サイズ変更とオートフィルは履歴に載るため、Ctrl+Z で戻せます (元に戻す・やり直す)。
日本語入力
非編集状態のセルで日本語入力を始めると、その場でエディタが開いて変換が続きます。 変換候補ウィンドウはアクティブセルの位置に出ます。
これは WinForms / WPF / Avalonia の 3 つとも同じ動作です。Avalonia は Linux / macOS でも 各 OS の入力メソッドで同様に動きます。
ホスト側で横取りする
キー割り当てを差し替える API はありません。変えたい場合はコントロールを派生させて キーイベントを先に処理します。
WinForms:
public class MyGrid : ReoGridControl
{
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.S) { Save(); e.Handled = true; return; }
base.OnKeyDown(e); // 既定の処理へ
}
}
WPF / Avalonia でも同じ形(OnKeyDown のオーバーライド)です。
e.Handled = true にして base を呼ばなければ、既定の動作は起こりません。
逆に、既定の動作の後に処理を足したい場合は先に base を呼びます。
アプリ全体のショートカット(Ctrl+S など)は、グリッドではなくウィンドウ側で 受けるほうが素直です。グリッドは自分が使わないキーを握りつぶさないため、 ウィンドウのメニューアクセラレータはそのまま動きます。
編集を禁止する
読み取り専用の表示にしたい場合は、編集を始める 3 つの入口をふさぎます — F2 と Delete、文字キーの打ち込み、セルのダブルクリックです。
public class ReadOnlyGrid : ReoGridControl
{
protected override void OnKeyDown(KeyEventArgs e)
{
if (e.KeyCode is Keys.F2 or Keys.Delete or Keys.Back) { e.Handled = true; return; }
base.OnKeyDown(e); // 移動・コピーはそのまま使える
}
// 文字キーによる編集開始を止める
protected override void OnKeyPress(KeyPressEventArgs e) { e.Handled = true; }
// ダブルクリックによる編集開始を止める(base を呼ばない)
protected override void OnMouseDoubleClick(MouseEventArgs e) { }
}
貼り付け(Ctrl+V)も止めたい場合は Keys.V when e.Control を上の条件に加えます。
入力そのものを禁止したいだけなら、キー処理を潰すよりシート保護のほうが確実です。
ws.Protect() でシートを保護し、ws.SetRangeLock(range, LockState.Unlocked) で
編集させたい範囲だけを開けます。拒否は ws.EditRefused で通知されます。