ReoGrid は軽量なアクションフレームワーク(unvell.Common.ActionManager をベース)を使い、すべての操作を記録し、Undo/Redo を提供し、アプリ側で編集をまとめたりカスタマイズしたりできます。このガイドでは組み込みアクションの使い方、複合化、独自アクションの作成、実行のモニタリング方法を紹介します。
ReoGrid アクションの簡単な例です。
// Select a worksheet
grid.CurrentWorksheet = mysheet;
// Create an action (set cell 'A1' to 100)
var action = new SetCellDataAction("A1", 100);
// Perform the action
grid.DoAction(action);
最後のアクションを Undo / Redo する
Undo / Redo を行うと、CurrentWorksheet は実行対象だったワークシートへ自動で切り替わります。
grid.Undo(); // Undo
grid.Redo(); // Redo
組み込みアクションを使う
セル値を更新する
using unvell.ReoGrid;
using unvell.ReoGrid.Actions;
var sheet = grid.CurrentWorksheet;
var action = new SetCellDataAction(2, 1, "Hello"); // row 2, column 1 (zero-based)
grid.DoAction(sheet, action);
行を削除する
using unvell.ReoGrid;
using unvell.ReoGrid.Actions;
var sheet = grid.CurrentWorksheet;
var deleteRows = new RemoveRowsAction(row: 5, rows: 3);
grid.DoAction(sheet, deleteRows);
どちらの呼び出しでも Undo 1 件が積まれ、コントロールの Undo / Redo で自動的に元に戻す・やり直すことができます。
アクション種別を理解する
- WorksheetAction
ほとんどのシート単位操作の基底クラス。Do/Undoを持ち、実行前にコントロールからWorksheet参照が設定されます。 - WorksheetReusableAction
WorksheetActionを拡張し、同じ操作を他の範囲へ複製・再実行できます。“繰り返し”コマンドの実装に使われます。 - WorksheetActionGroup
複数のWorksheetActionを 1 つの履歴としてまとめて実行・Undo します。関連する編集を一括で扱いたい場合(依存列の更新など)に使います。var group = new WorksheetActionGroup(); group.Actions.Add(new SetCellDataAction(row, 0, key)); group.Actions.Add(new SetCellDataAction(row, 1, LookupPrice(key))); group.Actions.Add(new SetCellDataAction(row, 2, LookupDescription(key))); grid.DoAction(sheet, group); // one undo item - WorksheetReusableActionGroup
グループ化しつつ再利用可能なバージョン。作成時に対象範囲を渡します。var repeatable = new WorksheetReusableActionGroup(new RangePosition("B2:D5")); repeatable.Actions.Add(new SetRangeStyleAction(repeatable.Range, new WorksheetRangeStyle { Flag = PlainStyleFlag.BackColor, BackColor = Color.LightYellow, })); grid.DoAction(sheet, repeatable); // Later you can clone onto another range: grid.RepeatLastAction(sheet, new RangePosition("F2:H5"));
独自アクションを作成する
WorksheetAction(繰り返しが必要なら WorksheetReusableAction)を実装し、Do、Undo、GetName をオーバーライドします。
using unvell.ReoGrid.Actions;
class ToggleRowHighlightAction : WorksheetAction
{
private readonly int row;
private bool[]? originalStates;
public ToggleRowHighlightAction(int row) { this.row = row; }
public override void Do()
{
originalStates = new bool[Worksheet.ColumnCount];
for (int c = 0; c < Worksheet.ColumnCount; c++)
{
var cell = Worksheet.CreateAndGetCell(row, c);
originalStates[c] = cell.Style.Bold;
cell.Style.Bold = !cell.Style.Bold;
}
}
public override void Undo()
{
if (originalStates == null) return;
for (int c = 0; c < Worksheet.ColumnCount && c < originalStates.Length; c++)
{
var cell = Worksheet.CreateAndGetCell(row, c);
cell.Style.Bold = originalStates[c];
}
}
public override string GetName() => "Toggle Row Highlight";
}
実行方法は組み込みアクションと同じです: grid.DoAction(sheet, new ToggleRowHighlightAction(3));
アクションの実行を監視する
ReoGrid はアクションを監査・ログ・置換できるイベントを公開しています。
コントロールレベルのイベント
grid.BeforeActionPerform += (s, e) =>
{
// e.Action is about to run; set e.IsCancelled = true to stop it.
};
grid.ActionPerformed += (s, e) =>
{
// e.Action finished (Do/Redo). Use grid.Undid and grid.Redid for undo/redo hooks.
};
grid.Undid += (s, e) => { /* last action was undone */ };
grid.Redid += (s, e) => { /* last action was redone */ };
ActionBehavior(Do / Undo / Redo)の確認
内部の ActionManager は BeforePerformAction / AfterPerformAction を発火し、ActionEventArgs.Behavior が ActionBehavior.Do、Undo、Redo のいずれかになります。詳細を記録したい場合はこれらをフックしてください。カスタムコントロール内や ActionManager へ直接アクセスできるときの例です。
actionManager.AfterPerformAction += (s, e) =>
{
switch (e.Behavior)
{
case ActionBehavior.Do:
Log($"Do: {e.Action.GetName()}");
break;
case ActionBehavior.Undo:
Log($"Undo: {e.Action.GetName()}");
break;
case ActionBehavior.Redo:
Log($"Redo: {e.Action.GetName()}");
break;
}
};
アクションを差し替える
ユーザー操作を横取りしてキャンセルし、代わりに独自(必要ならグループ化した)アクションを実行できます。
grid.BeforeActionPerform += (s, e) =>
{
if (e.Action is SetCellDataAction set && set.Column == 0)
{
e.IsCancelled = true; // skip default
var group = new WorksheetActionGroup();
group.Actions.Add(set); // keep the original edit
group.Actions.Add(new SetCellDataAction(set.Row, 1, "auto-fill"));
grid.DoAction(grid.CurrentWorksheet, group);
}
};
依存する更新を 1 つの Undo 可能な操作としてまとめたいときに便利なパターンです。
複数ワークシートにまたがるアクション
同一ブック内で異なるワークシートに対してアクションを実行できます。対象ワークシートが異なっても、ReoGrid は実行順を保持します。Undo / Redo すると、ワークシートに関係なく実行された順序で処理されます。
たとえば Sheet1 のセルを更新し、その後 Sheet2 を更新した場合、Undo では最後に行った Sheet2 の操作から元に戻り、その後に Sheet1 の操作が戻ります。Redo は元の順番で再適用されます。
これにより、ブック内すべてのワークシートで履歴の整合性が保たれます。