FlexGrid for WinForms
フィルタ操作
フィルタ > フィルタ操作

次の 2 つの方法でグリッドデータのフィルタ処理を実行できます。

ヘッダーベースのフィルタ

ヘッダーベースのフィルタ処理では、列のヘッダーセルにアイコンが表示されます。このアイコンをクリックすると、フィルタを指定するためのオプションがドロップダウンに表示されます。また、特定の列にフィルタが適用されているかどうかも示されます。FlexGrid では、グリッドの AllowFiltering プロパティを使用するだけで、この動作を実行できます。この場合、フィルタのための余分な画面領域は必要ありません。また、この方法では、フィルタエディタを自由にカスタマイズして作成できます。カスタマイズの詳細については、後述のセクションで説明しています。

フィルタ行

フィルタ行はフィルタ条件が表示される行で、列ヘッダーの直下に表示されます。この場合、ユーザーは、フィルタ処理された列と現在のフィルタ条件を常に見ることができます。ただし、この長所の半面、フィルタ行のための画面領域が余分に必要になります。FlexGrid では、カスタム実装を使用して、フィルタ行を簡単を追加できます。実装については、「Filter Row(フィルタ行)」という名前の製品サンプルを参照してください。

メモ: ComponentOneControlPanel.exe を使用して WinForms Edition をインストールする際にサンプルをインストールした場合、「フィルタ行」サンプルは、システムの \Documents\ComponentOne Samples\WinForms\v4.5.2\C1FlexGrid\CS にあります。

フィルタの許可

FlexGrid でフィルタ処理を有効にするには、C1FlexGrid.AllowFiltering プロパティを true に設定します。これで、グリッドのすべての列でデフォルトの ColumnFilter が有効になります。ColumnFilter が有効な場合、ユーザーは実行時に ValueFilter または ConditionFilter を選択できます。

フィルタ処理の許可

また、各 Column オブジェクトの AllowFiltering プロパティを設定することで、各列にフィルタタイプを指定することもできます。 Column の AllowFiltering プロパティには、次のいずれかの値を選択できます。

説明
Default ValueFilter と ConditionFilter を組み合わせた ColumnFilter が有効になります。ユーザーは、実行時にいずれかを選択できます。
ByValue その列に含まれる値のチェックボックスリストを含む ValueFilter が有効になります。 ユーザーは、それらのチェックボックスをオフにして、フィルタ後の出力に表示しない値を指定できます。
ByCondition 「equals」、「greater than」、「contains」などから 2 つの条件を組み合わせて指定できる ConditionFilter が有効になります。条件を組み合わせるには、「And」または「Or」の演算子を使用します。
Custom カスタムフィルタをインスタンス化し、それを列の Filter プロパティに明示的に割り当てることができます。
None 列のフィルタを無効にします。

WinForms FlexGrid の最初の列で条件フィルタを有効にするには、次のコードスニペットを使用します。

// グリッドでのフィルタリングを許可します
c1FlexGrid1.AllowFiltering = true;
                                        
// 列1に対してフィルタを指定します
c1FlexGrid1.Cols[1].AllowFiltering = C1.Win.C1FlexGrid.AllowFiltering.ByCondition; 
' グリッドでのフィルタリングを許可します
c1FlexGrid1.AllowFiltering = True
' 列1に対してフィルタを指定します
c1FlexGrid1.Cols(1).AllowFiltering = C1.Win.C1FlexGrid.AllowFiltering.ByCondition

前述のフィルタタイプの詳細については、「フィルタのタイプ」を参照してください。

コードによるフィルタ

グリッドの AllowFiltering プロパティを指定すると、グリッドのフィルタ処理が有効になります。このプロパティは多くの一般的なシナリオで使用できますが、フィルタオプションの調整がさらに必要な場合もあります。それには、各列の AllowFiltering プロパティと Filter プロパティを変更します。 たとえば、次のコードは、WinForms FlexGrid のフィルタ処理を文字列型の列に制限して有効にしています。

// 文字列型の列にフィルタリングを制限します
 foreach (Column c in c1FlexGrid1.Cols)
     {
          c.AllowFiltering = c.DataType == typeof(string)
               ? AllowFiltering.Default 
               : AllowFiltering.None;
     }                       
' 文字列型の列にフィルタリングを制限します
For Each c As Column In c1FlexGrid1.Cols
    c.AllowFiltering = If(c.DataType Is GetType(String), AllowFiltering.Default, AllowFiltering.None)
Next        

さらに、フィルタを作成して列に割り当てたり、既存のフィルタを取得してそのプロパティを変更することで、フィルタ処理をカスタマイズすることもできます。たとえば、次のコードでは、WinForms FlexGrid に ConditionFilter を作成して、「Germany」に一致するすべての項目を選択するように設定し、この新しいフィルタを[ShipCountry]列に割り当てています。

// グリッドでフィルタリングを有効にします
 c1FlexGrid1.AllowFiltering = true;
                                
 // 新しいConditionFilterを作成します
 C1.Win.C1FlexGrid.ConditionFilter Filter;
 Filter = new C1.Win.C1FlexGrid.ConditionFilter();
                                
 // Germanyのアイテムを絞り込むためのフィルタを作成します
 Filter.Condition1.Operator = C1.Win.C1FlexGrid.ConditionOperator.Equals;
 Filter.Condition1.Parameter = "Germany";
                                
 // 「ShipCountry」列に新しいフィルタを割り当てます
 c1FlexGrid1.Cols["ShipCountry"].Filter = Filter;
                                
 // フィルタを適用します
 c1FlexGrid1.ApplyFilters();
' グリッドでフィルタリングを有効にします
c1FlexGrid1.AllowFiltering = True
' 新しいConditionFilterを作成します
Dim Filter As C1.Win.C1FlexGrid.ConditionFilter
Filter = New C1.Win.C1FlexGrid.ConditionFilter()
' Germanyのアイテムを絞り込むためのフィルタを作成します
Filter.Condition1.[Operator] = C1.Win.C1FlexGrid.ConditionOperator.Equals
Filter.Condition1.Parameter = "Germany"
' 「ShipCountry」列に新しいフィルタを割り当てます
c1FlexGrid1.Cols("ShipCountry").Filter = Filter
' フィルタを適用します
c1FlexGrid1.ApplyFilters()

カスタムフィルタ処理

FlexGrid にフィルタ処理を適用すると、フィルタ条件を満たさない行は、Visible プロパティが false に設定されて非表示になります。ただし、この動作のカスタマイズが必要な場合もあります。 そのようなシナリオでは、FlexGrid が発生する BeforeFilter イベントと AfterFilter イベントを利用できます。次のサンプルでは、条件を満たさない行を非表示にする代わりに、それらの行に別のスタイルを適用して、WinForms FlexGrid のフィルタ処理動作をカスタマイズしています。

Custom filtering

private void c1FlexGrid1_BeforeFilter(object sender, CancelEventArgs e)
{
    c1FlexGrid1.BeginUpdate();
}

private void c1FlexGrid1_AfterFilter(object sender, EventArgs e)
{
    // フィルタリングされた行を表示するために使用されるスタイルを取得します
    var cs = c1FlexGrid1.Styles["filteredOut"];

    // すべての行にスタイルを適用します
    for (int r = c1FlexGrid1.Rows.Fixed; r < c1FlexGrid1.Rows.Count; r++)
    {
        var row = c1FlexGrid1.Rows[r];
        if (row.Visible)
        {
            // 通常の行、スタイルをリセットします
            row.Style = null;
        }
        else
        {
            // フィルタリングされた行。 見えるようにし、スタイルを適用します。
            row.Visible = true;
            row.Style = cs;
        }
    }

    // 更新を再開します
    c1FlexGrid1.EndUpdate();
}
Private Sub c1FlexGrid1_BeforeFilter(ByVal sender As Object, ByVal e As CancelEventArgs)
    c1FlexGrid1.BeginUpdate()
End Sub

Private Sub c1FlexGrid1_AfterFilter(ByVal sender As Object, ByVal e As EventArgs)
    ' フィルタリングされた行を表示するために使用されるスタイルを取得します
    Dim cs = c1FlexGrid1.Styles("filteredOut")

    ' すべての行にスタイルを適用します
    For r = c1FlexGrid1.Rows.Fixed To c1FlexGrid1.Rows.Count - 1
        Dim row = c1FlexGrid1.Rows(r)

        If row.Visible Then
            ' 通常の行、スタイルをリセットします
            row.Style = Nothing
        Else
            ' フィルタリングされた行。 見えるようにし、スタイルを適用します。
            row.Visible = True
            row.Style = cs
        End If
    Next

    ' 更新を再開します
    c1FlexGrid1.EndUpdate()
End Sub

前述のコードでは、「filteredout」というカスタムスタイルを使用しています。これは、次のコードで定義されます。

// フィルタによって除外された行のスタイルを作成します
var cs = c1FlexGrid1.Styles.Add("filteredOut");
cs.BackColor = Color.LightGray;
cs.ForeColor = Color.DarkGray;
' フィルタによって除外された行のスタイルを作成します
Dim cs = c1FlexGrid1.Styles.Add("filteredOut")
cs.BackColor = Color.LightGray
cs.ForeColor = Color.DarkGray

フィルタの削除

ユーザーは、各列のフィルタ UI にある[クリア]オプションを使用して、実行時に列フィルタ処理を削除できます。また、グリッド全体のフィルタ処理をプログラムで削除することもできます。それには、FlexGrid の FilterDefinition プロパティに空の文字列を渡します。

次のコードは、WinForms FlexGrid からすべてのフィルタをクリアする方法を示しています。

// フィルタ定義を空の文字列に設定して、フィルタリングを削除します
c1FlexGrid1.FilterDefinition = string.Empty;   
' フィルタ定義を空の文字列に設定して、フィルタリングを削除します
c1FlexGrid1.FilterDefinition = String.Empty