ReoGridアクションフレームワーク

ReoGridは軽量なアクションフレームワーク(unvell.Common.ActionManagerに基づく)を使用して、すべての操作を記録し、元に戻す/やり直しをサポートし、アプリケーションが編集をグループ化またはカスタマイズできるようにしています。このガイドでは、組み込みアクションの使用方法、アクションの合成、カスタムアクションの作成、実行の監視方法を説明します。

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);

最後のアクションを元に戻す/やり直す

アクションを元に戻した後またはやり直した後、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);

いずれの呼び出しの後も、ReoGridは1つの元に戻すアイテムをプッシュします。コントロールのUndo/Redoはアクションを自動的に元に戻したりやり直したりします。

すべてのワークシートアクションの完全なリストはこちらを参照してください。

アクションタイプを理解する

  • WorksheetAction ほとんどのシートスコープの操作の基底クラスです。Do/Undoと、コントロールが実行前に設定するWorksheet参照を提供します。
  • WorksheetReusableActionWorksheetActionを拡張し、同じ操作を複製して別の範囲で繰り返せるようにします。ReoGridはこれを使用して「繰り返し」コマンドをサポートしています。
  • WorksheetActionGroup 複数のWorksheetActionインスタンスをラップして、1つの履歴アイテムとして実行・元に戻しできるようにします。関連する編集をグループ化する際に使用します(例: 依存する列の更新):
    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)を検査する

基盤となるActionManagerは、ActionEventArgs.BehaviorActionBehavior.DoUndo、またはRedoに設定されたBeforePerformActionAfterPerformActionを発生させます。そのレベルの詳細が必要な場合(例: ログ記録)、これらのイベントをフックします。カスタムコントロール内または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つの元に戻し可能な操作として記録する必要がある場合に便利です。

複数のワークシートにまたがるアクション

アクションは同じワークブック内の異なるワークシートで実行できます。ReoGridは異なるワークシートをターゲットにしたアクションでも実行順序を保持します。元に戻したりやり直したりする際、どのワークシートをターゲットにしたかに関係なく、元の実行順序と同じ順序で処理されます。

例えば、Sheet1のセルを更新し、次にSheet2のセルを更新した場合、元に戻す操作はまず最後のアクション(Sheet2)を元に戻し、続いて前のアクション(Sheet1)を元に戻します。やり直しは元の順序で適用されます。

158 元に戻す場合、アクションは逆順で元に戻されます。 159

これにより、ワークブック内のすべてのワークシートにわたって一貫した履歴管理が保証されます。


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