カスタムセル > コードでのカスタムセル:CellFactory クラス |
次のセクションでは、FlexGrid .NET 4.5.2および.NET 5バージョンで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); } |
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); } } } |