FlexGrid for WPF
コードでのカスタムセル:CellFactory クラス
カスタムセル > コードでのカスタムセル:CellFactory クラス

次のセクションでは、FlexGrid .NET 4.5.2および.NET 5バージョンでCellFactoryを使用してカスタムセルを実装する方法を学習します。

C1FlexGrid には、グリッドに表示されるすべてのセルを作成する CellFactory クラスが含まれます。カスタムセルを作成するには、ICellFactory インターフェイスを実装するクラスを作成し、このクラスをグリッドの CellFactory プロパティに割り当てる必要があります。

カスタム列と同様に、カスタム ICellFactory クラスは、極めて特殊なアプリケーション固有のクラスである場合も、一般的で再利用可能な構成可能なクラスである場合も考えられます。 通常、カスタム ICellFactory クラスは直接セルを操作するため、カスタム列より簡潔です。カスタム ICellFactory クラスは、C1FlexGrid クラスに含まれるデフォルトの CellFactory クラスを継承できるため、比較的簡単に実装することができます。デフォルトの CellFactory クラスは、拡張可能なクラスになるように設計されているため、セル作成の詳細処理はすべてこのクラスに任せて、必要な部分だけをカスタマイズすることができます。

次の図に、FlexGrid で CellFactory を使用して作成されたカスタムセルを示します。

               

カスタムセルを使用する際は、グリッドセルが一時的であることを理解しておく必要があります。セルは、ユーザーがグリッドの範囲をスクロール、ソート、選択するたびに作成され、破棄されます。このプロセスは「仮想化」と呼ばれ、WPF アプリケーションではごく一般的です。仮想化を使用しないと、グリッドは通常、数千個ものビジュアル要素を同時に作成しなければならなくなり、パフォーマンスに影響を与えます。

次のコードは、CellFactory インタフェースを示しています。

C#
コードのコピー
public interface ICellFactory
{
  FrameworkElement CreateCell(
    C1FlexGrid grid,
    CellType cellType,
    CellRange range);

  FrameworkElement CreateCellEditor(
    C1FlexGrid grid,
    CellType cellType,
    CellRange range);

  void DisposeCell(
    C1FlexGrid grid,
    CellType cellType,
    FrameworkElement cell);
}

最初のメソッド CreateCell は、セルを表す FrameworkElement オブジェクトを作成します。このパラメータには、セルを所有するグリッド、作成するセルの種類、および表される CellRange が含まれます。CellType パラメータは、作成されるセルが通常のデータセル、行ヘッダーまたは列ヘッダー、グリッドの左上および右下の固定セルのどれなのかを指定します。CreateCellEditor メソッドは、最初のメソッドに似ていますが、セルを編集モードで作成します。最後の DisposeCell メソッドは、グリッドからセルが削除された後で呼び出されます。これにより、呼び出し元は、セルオブジェクトに関連付けられているすべてのリソースを破棄できます。
               

FlexGrid には、グリッドに表示されるすべてのセルを作成する GridCellFactory クラスが含まれます。

カスタム列と同様に、カスタム GridCellFactory クラスは、極めて特殊なアプリケーション固有のクラスである場合も、一般的で再利用可能な構成可能なクラスである場合も考えられます。 通常、カスタム GridCellFactory クラスは直接セルを操作するため、カスタム列より簡潔です。カスタム ICellFactory クラスは、FlexGrid クラスに含まれるデフォルトの GridCellFactory クラスを継承できるため、比較的簡単に実装することができます。デフォルトの GridCellFactory クラスは、拡張可能なクラスになるように設計されているため、セル作成の詳細処理はすべてこのクラスに任せて、必要な部分だけをカスタマイズすることができます。

次の図に、FlexGrid で GridCellFactory を使用して作成されたカスタムセルを示します。

               

カスタムセルを使用する際は、グリッドセルが一時的であることを理解しておく必要があります。セルは、ユーザーがグリッドの範囲をスクロール、ソート、選択するたびに作成され、破棄されます。このプロセスは「仮想化」と呼ばれ、WPF アプリケーションではごく一般的です。仮想化を使用しないと、グリッドは通常、数千個ものビジュアル要素を同時に作成しなければならなくなり、パフォーマンスに影響を与えます。

次のコードは、GridCellFactory インタフェースを示しています。

C#
コードのコピー
public class FinancialCellFactory : GridCellFactory
{
    public override object GetCellContentType(GridCellType cellType, GridCellRange range)
    {
        if (cellType == GridCellType.Cell)
        {
            var c = base.Grid.Columns[range.Column];
            if (c.Binding == "LastSale" || c.Binding == "Bid" || c.Binding == "Ask")
            {
                return typeof(StockTicker);
            }
        }
        return base.GetCellContentType(cellType, range);
    }

    public override FrameworkElement CreateCellContent(GridCellType cellType, GridCellRange range, object cellContentType)
    {
        if (cellContentType as Type == typeof(StockTicker))
            return new StockTicker();
        return base.CreateCellContent(cellType, range, cellContentType);
    }

    public override void BindCellContent(GridCellType cellType, GridCellRange range, FrameworkElement cellContent)
    {
        var stockTicker = cellContent as StockTicker;
        if (stockTicker != null)
        {
            stockTicker.Tag = Grid.Rows[range.Row].DataItem;
            stockTicker.BindingSource = Grid.Columns[range.Column].Binding;
            stockTicker.Value = (double)(decimal)Grid[range.Row, range.Column];
        }
        else
        {
            base.BindCellContent(cellType, range, cellContent);
        }
    }
}

最初のメソッド CreateCell は、セルを表す FrameworkElement オブジェクトを作成します。このパラメータには、セルを所有するグリッド、作成するセルの種類、および表される CellRange が含まれます。CellType パラメータは、作成されるセルが通常のデータセル、行ヘッダーまたは列ヘッダー、グリッドの左上および右下の固定セルのどれなのかを指定します。CreateCellEditor メソッドは、最初のメソッドに似ていますが、セルを編集モードで作成します。最後の DisposeCell メソッドは、グリッドからセルが削除された後で呼び出されます。これにより、呼び出し元は、セルオブジェクトに関連付けられているすべてのリソースを破棄できます。
関連トピック