ReoGrid Version 4をリリースしました。多数の新機能に対応し、機能性・パフォーマンスの両面で大幅に強化されています。新機能の詳細については、こちらをご覧ください。
ReoGrid アクションフレームワーク

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)を実装し、DoUndoGetName をオーバーライドします。

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)の確認

内部の ActionManagerBeforePerformAction / AfterPerformAction を発火し、ActionEventArgs.BehaviorActionBehavior.DoUndoRedo のいずれかになります。詳細を記録したい場合はこれらをフックしてください。カスタムコントロール内や 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 は元の順番で再適用されます。

これにより、ブック内すべてのワークシートで履歴の整合性が保たれます。


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