DataGrid for WPF/Silverlight
行セルコンテンツのカスタマイズ
製品の概要 > DataGrid の機能 > カスタム行 > 行セルコンテンツのカスタマイズ

このトピックでは、セルコンテンツをカスタマイズする方法について説明します。たとえば、フィルタ行を作成する場合は、次の手順に従います。次の図のように、最初の行の各セルに TextBox を配置したグリッドを作成して、そこに入力したテキストによってグリッドがフィルタ処理されるようにすることができます。

クラスファイルの追加

カスタム行が記述された新しいクラスファイルを追加することが必要になる場合があります。たとえば、次の手順に従って新しいクラスファイルを追加します。

  1. ソリューションエクスプローラで、プロジェクト名を右クリックし、[追加]→[新しい項目]を選択します。
  2. [新しい項目の追加]ダイアログボックスで、利用可能なテンプレートのリストから[クラス]を選択します。
  3. クラスに「DataGridFilterRow」などの名前を付け、[追加]ボタンをクリックしてプロジェクトにクラスを追加します。
  4. クラスを更新します。次のようになります。
    Visual Basic
    コードのコピー
    Imports C1.WPF.DataGrid
    Public Class DataGridFilterRow
       Inherits DataGridRow
    End Class
    

    C#
    コードのコピー
    using C1.WPF.DataGrid;
    public class DataGridFilterRow : DataGridRow
    {
    }
    

    Visual Basic
    コードのコピー
    Imports C1.Silverlight.DataGrid
    Public Class DataGridFilterRow
       Inherits DataGridRow
    End Class
    

    C#
    コードのコピー
    using C1.Silverlight.DataGrid;
    public class DataGridFilterRow : DataGridRow
    {
    }
    

    これにより、DataGridRow から継承するようにクラスが更新されます。ファイルは、作成後に DataGridRow から継承する必要があります。

クラスを追加すると、それを使ってグリッドにフィルタ処理を実装できます。

メソッドのオーバーライド

カスタム行のセルコンテンツを指定するためにオーバーライドする必要があるメソッドは、カスタム列で公開されているメソッドとほぼ同じです。カスタムのセルコンテンツを実装するには、以下のメソッドをオーバーライドする必要があります。

フィルタ行では、すべての列に対応するセルがあるので、HasCellPresenter メソッドは常に True を返します。サマリー行など他のシナリオでは、セルは集計関数がある列にのみ存在します。

GetCellContentRecyclingKey メソッドは typeof(TextBox) を返すので、それによってテキストボックスを再利用できます。CreateCellContent は、その新しいインスタンスを作成します。次のコードを追加します。

コードのコピー
Protected Overrides Function GetCellContentRecyclingKey(column As DataGridColumn) As Object
      Return GetType(TextBox)
End Function
Protected Overrides Function CreateCellContent(column As DataGridColumn) As FrameworkElement
      Return New TextBox()
End Function
コードのコピー
protected override object GetCellContentRecyclingKey(DataGridColumn column)
{
    return typeof(TextBox);
}
protected override FrameworkElement CreateCellContent(DataGridColumn column)
{
    return new TextBox();
}

フィルタ処理の実装

前の手順では各セルに TextBox を追加しましたが、これらのコントロールは、現時点では何も実行しません。フィルタ処理を実装するには、次の手順に従います。

  1. BindCellContent メソッドに次のコードを追加します。
    コードのコピー
    Protected Overrides Sub BindCellContent(cellContent As FrameworkElement, column As DataGridColumn)
       Dim filterTextBox = DirectCast(cellContent, TextBox)
       '列に FilterMemberPath が指定されていない場合、
       'TextBox にテキストは入力できません。
       If String.IsNullOrEmpty(column.FilterMemberPath) Then
             filterTextBox.IsEnabled = False
             filterTextBox.Text = "利用不可能"
       Else
             filterTextBox.Text = ""
             filterTextBox.IsEnabled = True
       End If
       ' TextChanged を処理し、列にフィルタを適用します。
       filterTextBox.TextChanged += New EventHandler(Of TextChangedEventArgs)(filterTextBox_TextChanged)
    End Sub
    
    コードのコピー
    protected override void BindCellContent(FrameworkElement cellContent, DataGridColumn column)
    {
        var filterTextBox = (TextBox)cellContent;
        //列に FilterMemberPath が指定されていない場合、
        //TextBox にテキストは入力できません。
        if (string.IsNullOrEmpty(column.FilterMemberPath))
        {
            filterTextBox.IsEnabled = false;
            filterTextBox.Text = "利用不可能";
        }
        else
        {
            filterTextBox.Text = "";
            filterTextBox.IsEnabled = true;
        }
        // TextChanged を処理し、列にフィルタを適用します。
        filterTextBox.TextChanged += new EventHandler(filterTextBox_TextChanged);
    }
    

  2. UnbindCellContent では、メモリリークを防止するために、テキスト変更ハンドラを削除する必要があります。
    コードのコピー
    Protected Overrides Sub UnbindCellContent(cellContent As FrameworkElement, column As DataGridColumn)
       Dim filterTextBox = DirectCast(cellContent, C1SearchBox)
       filterTextBox.TextChanged -= New EventHandler(Of TextChangedEventArgs)(filterTextBox_TextChanged)
    End Sub
    
    コードのコピー
    protected override void UnbindCellContent(FrameworkElement cellContent,
    DataGridColumn column) { var filterTextBox = (C1SearchBox)cellContent;
    filterTextBox.TextChanged -= new EventHandler(filterTextBox_TextChanged); }