FlexGrid for WinForms
カスタム結合
結合 > カスタム結合

FlexGrid では、AllowMerging プロパティを使用する多くの一般的なシナリオで、結合を実行するための十分なオプションがデフォルトで提供されています。しかし、結合オプションをカスタマイズして、グリッドの外観をさらに向上させたい場合もあります。デフォルトの結合動作は以下の 2 つの方法でカスタマイズできます。

方法 1:IComparer インタフェースの使用

デフォルトでは、null 以外の同じ値を含む隣接するセルが結合されます。この場合、文字列は大文字小文字を区別して比較され、空白は含まれます。ただし、大文字小文字を区別しないで比較を行ったり、空白をトリミングしてセルを結合することもできます。それには、IComparer インタフェースを実装するカスタムクラスを記述し、それを C1FlexGrid クラスの CustomComparer プロパティに割り当てます。

方法 2:GetMergedRange メソッドのオーバーライド

もう 1 つは、C1FlexGrid クラスから派生された新しいクラスを作成し、GetMergedRange メソッドと GetData メソッドをオーバーライドして独自のカスタム結合ロジックを提供する方法です。 このクラスは、FlexGrid 内のデータを文脈依存で解釈し、それに基づいてセルを結合します。以下の例では、これがオーバーライドメソッドによって実装されています。 次の例は、WinForms FlexGrid を使用した講師のタイムテーブルでカスタム結合を使用したところです。

カスタム結合

public override CellRange GetMergedRange(int row, int col, bool clip)
{
  // 結合のロジックで使用するID列のインデックスを保存します
  _colIndex = Cols.IndexOf("LecturerID");
  // 結合する時にカスタムデータを使用するようにフラグを設定します
  _doingMerge = true;
  // 基本クラスの結合のロジックを呼び出します(GetDataメソッドを使用してデータを取得します)
  CellRange cellRange = base.GetMergedRange(row, col, clip);
  // GetDataが通常どおりに動作するようにフラグをリセットします
  _doingMerge = false;
  // 結合された範囲を返します
  return cellRange;
 }
 public override Object GetData(int row, int col)
  {
    // 結合範囲を決定するためのデータを取得します。
    // ID列のコンテンツを追加して、異なるIDの行のセルがマージされないようにします
    if (_doingMerge && _colIndex > -1 && col != _colIndex)
         {
          System.Diagnostics.Debug.WriteLine($"{row},{col}");
          return base.GetDataDisplay(row, col) + base.GetDataDisplay(row, _colIndex);
         }
   // 表示、測定、編集などするデータを取得します。
   // 基本クラスに通常どおり処理させます
   return base.GetData(row, col);
   }               
Public Overrides Function GetMergedRange(ByVal row As Integer, ByVal col As Integer, ByVal clip As Boolean) As CellRange
    ' 結合のロジックで使用するID列のインデックスを保存します
    _colIndex = Cols.IndexOf("LecturerID")
    ' 結合する時にカスタムデータを使用するようにフラグを設定します
    _doingMerge = True
    ' 基本クラスの結合のロジックを呼び出します(GetDataメソッドを使用してデータを取得します)
    Dim cellRange As CellRange = MyBase.GetMergedRange(row, col, clip)
    ' GetDataが通常どおりに動作するようにフラグをリセットします
    _doingMerge = False
    ' 結合された範囲を返します
    Return cellRange
End Function
Public Overrides Function GetData(ByVal row As Integer, ByVal col As Integer) As Object
    ' 結合範囲を決定するためのデータを取得します。
    ' ID列のコンテンツを追加して、異なるIDの行のセルがマージされないようにします
    If _doingMerge AndAlso _colIndex > -1 AndAlso col <> _colIndex Then
        Debug.WriteLine($"{row},{col}")
        Return MyBase.GetDataDisplay(row, col) + MyBase.GetDataDisplay(row, _colIndex)
    End If

    ' 表示、測定、編集などするデータを取得します
    ' 基本クラスに通常どおり処理させます
    Return MyBase.GetData(row, col)
End Function   

その他のカスタム結合シナリオの詳細な実装方法については、製品プロジェクト CustomMergeCustomMerge2CustomMerge3、および CustomMerge4 を参照してください。

メモ: ComponentOneControlPanel.exe を使用して WinForms Edition をインストールする際にサンプルをインストールした場合、前述の製品サンプルは、システムの \Documents\ComponentOne Samples\WinForms\vx.x.x\C1FlexGrid\CS にあります。