FlexGrid for UWP
コードでのカスタムセル
C1FlexGrid の使い方 > カスタムセル > コードでのカスタムセル
既に ICellFactory クラスについて理解している場合は、ここをクリックして、C1FlexGrid CellFactory の実装に進むことができます。

このグリッドには、グリッドに表示されるすべてのセルを作成する CellFactory クラスが含まれます。カスタムセルを作成するには、ICellFactory インタフェースを実装するクラスを作成し、このクラスをグリッドの CellFactory プロパティに割り当てる必要があります。カスタム列と同様に、カスタム ICellFactory クラスは、極めて特殊なアプリケーション固有のクラスである場合も、一般的で再利用可能な構成可能なクラスである場合も考えられます。通常、カスタム ICellFactory クラスは、セルを直接処理するため、カスタム列よりもかなり簡単になります(カスタム列は、列自体のほか、その列に含まれるセルなどの他のオブジェクトを処理する必要があります)。

ICellFactory インタフェースは極めて単純です。

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

ICellFactory インタフェースは、次の3つのメソッドを呼び出します。

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

実装

カスタム ICellFactory クラスは、C1FlexGrid に含まれるデフォルトの CellFactory クラスから継承できるため、比較的簡単に実装することができます。

デフォルトの CellFactory クラスは、拡張可能なクラスになるように設計されているため、セル作成の詳細処理はすべてこのクラスに任せて、必要な部分だけをカスタマイズすることができます。次のコードは、安値を赤色、高値を緑色にする条件付き書式設定を適用します。

C#
コードのコピー
c1FlexGrid1.CellFactory = new ConditionalFormattingFactory();
       class ConditionalFormattingFactory : CellFactory
            {
       // 安値と高値を示すために使用するブラシを作成します
        static Brush _brLowValue = new SolidColorBrush(Colors.Red);
        static Brush _brHighValue = new SolidColorBrush(Colors.Green);
            
       // セルの値に基づいてカスタムブラシを適用するためにオーバーライドされます
         public override void ApplyCellStyles(C1FlexGrid grid, CellType cellType, 
             CellRange range, Border bdr)
             {
       // データセルだけを対象とします(ヘッダーは対象外)
         if (cellType == CellType.Cell)
             {
       // double 値だけを対象とします
         var col = grid.Columns[range.Column];
         if (col.DataType == typeof(double))
             {
       // セル値を取得します
         var value = (double)grid[range.Row, col];
            
       // 値が範囲外の場合の書式設定を適用します
         if (value < 100 || value > 1000)
             {
             var tb = bdr.Child as
            TextBlock;
             if (tb != null)
             {
             bdr.Background = value < 100 ? _brLowValue : _brHighValue;
                    }
                  }
                }
              }
            }
       }