MESCIUS SPREAD for Windows Forms 17.0J
カスタムフィルタ

独自の処理で行をフィルタリングするカスタムフィルタを作成できます。

カスタムフィルタを作成するには、BaseFilterItemクラス、またはDefaultFilterItemクラスを継承するクラスを作成します。そして、次のメンバをオーバーライドして処理を記述します。

オーバーライドするメンバ 説明
DisplayNameプロパティ フィルタ項目リストに表示するテキストを返します。
ShowInDropDownメソッド フィルタ項目リストにカスタムフィルタを表示するかどうかを返します。通常は、表示されている行のいずれかがカスタムフィルタの条件に該当する場合(カスタムフィルタが有効な場合)に表示するよう、記述します。
Filterメソッド 独自のフィルタリング処理を記述します。
SerializeおよびDeserializeメソッド 既定のプロパティの永続化を独自に実装する場合以外は、baseクラスのSerialize、およびDeserializeメソッドを呼び出します。

カスタムフィルタを使用するには、フィルタの列定義を作成し、FilterColumnDefinitionオブジェクトのFiltersプロパティでFilterItemCollectionオブジェクトを参照し、カスタムフィルタのインスタンスを追加します。詳細は、後述のサンプルコードを参照してください。

サンプルコード

次のサンプルコードは、1000以上5000以下の値をもつ行をフィルタするカスタムフィルタを作成します。作成したカスタムフィルタを、シートの2列目に設定します。

C#
コードのコピー
[Serializable()]
public class CustomFilter : FarPoint.Win.Spread.BaseFilterItem
{
    FarPoint.Win.Spread.SheetView sv = null;
    public CustomFilter() { }
    public override string DisplayName
    {
        //フィルタに表示する文字列
        get { return "1000以上5000以下"; }
    }
    public override FarPoint.Win.Spread.SheetView SheetView
    {
        set { sv = value; }
    }
    private bool IsNumeric(object ovalue)
    {
        System.Text.RegularExpressions.Regex _isNumber = new System.Text.RegularExpressions.Regex(@"^\-?\d+\.?\d*$");
        System.Text.RegularExpressions.Match m = _isNumber.Match(Convert.ToString(ovalue));
        return m.Success;
    }
    public bool IsFilteredIn(object ovalue)
    {
        bool ret = false;
        if (IsNumeric(ovalue))
        {
            if (Double.Parse(Convert.ToString(ovalue)) >= 1000 && Double.Parse(Convert.ToString(ovalue)) <= 5000)
                ret = true;
        }
        return ret;
    }
    public override bool ShowInDropDown(int columnIndex, int[] filteredInRowList)
    {
        // filteredInRowList引数はフィルターイン行リスト
        // 条件に合うデータが存在する時のみ項目リストに表示
        if (filteredInRowList == null)
        {
            for (int i = 0; i < sv.RowCount; i++)
            {
                object value = sv.GetValue(i, columnIndex);
                if (value != null)
                {
                    if (IsFilteredIn(value))
                        return true;
                }
            }
        }
        else
        {
            // 現在の行リストが条件に合致するか確認
            for (int i = 0; i < filteredInRowList.Length; i++)
            {
                int row = filteredInRowList[i];
                object value = sv.GetValue(row, columnIndex);
                if (value != null)
                {
                    if (IsFilteredIn(value))
                        return true;
                }
            }
        }
        return false;
    }
    public override int[] Filter(int columnIndex)
    {
        System.Collections.ArrayList ar = new System.Collections.ArrayList();
        object val;
        for (int i = 0; i < sv.RowCount; i++)
        {
            val = sv.GetValue(i, columnIndex);
            if (IsFilteredIn(val))
                ar.Add(i); //条件に合致する行番号をリストに追加
        }
        return (Int32[])(ar.ToArray(typeof(Int32)));
    }
    public override bool Serialize(System.Xml.XmlTextWriter w)
    {
        w.WriteStartElement("CustomFilter");
        base.Serialize(w);
        w.WriteEndElement();
        return true;
    }
    public override bool Deserialize(System.Xml.XmlNodeReader r)
    {
        if (r.NodeType == System.Xml.XmlNodeType.Element)
        {
            if (r.Name.Equals("CustomFilter"))
            {
                base.Deserialize(r);
            }
        }
        return true;
    }
}
//以下をコードビハインドに記述します
// 2列目にフィルタの列定義を作成
FarPoint.Win.Spread.FilterColumnDefinition fcd1 = new FarPoint.Win.Spread.FilterColumnDefinition(1,
    FarPoint.Win.Spread.FilterListBehavior.Custom | FarPoint.Win.Spread.FilterListBehavior.Default);
// カスタムフィルタを列定義に追加
fcd1.Filters.Add(new CustomFilter() { SheetView = fpSpread1.Sheets[0] });                   
// 非表示フィルタの作成
FarPoint.Win.Spread.HideRowFilter hideRowFilter = new FarPoint.Win.Spread.HideRowFilter(fpSpread1.Sheets[0]);
hideRowFilter.AddColumn(fcd1);
fpSpread1.Sheets[0].RowFilter = hideRowFilter;
// テストデータを設定
fpSpread1.Sheets[0].SetValue(0, 1, 999);
fpSpread1.Sheets[0].SetValue(1, 1, 1000);
fpSpread1.Sheets[0].SetValue(2, 1, 5000);
Visual Basic
コードのコピー
<Serializable>
Public Class CustomFilter
    Inherits FarPoint.Win.Spread.BaseFilterItem
    Private sv As FarPoint.Win.Spread.SheetView = Nothing
    Public Sub New()
    End Sub
    Public Overrides ReadOnly Property DisplayName() As String
        'フィルタに表示する文字列
        Get
            Return "1000以上5000以下"
        End Get
    End Property
    Public Overrides WriteOnly Property SheetView() As FarPoint.Win.Spread.SheetView
        Set
            sv = Value
        End Set
    End Property
    Private Function IsNumeric(ovalue As Object) As Boolean
        Dim _isNumber As New System.Text.RegularExpressions.Regex("^\-?\d+\.?\d*$")
        Dim m As System.Text.RegularExpressions.Match = _isNumber.Match(Convert.ToString(ovalue))
        Return m.Success
    End Function
    Public Function IsFilteredIn(ovalue As Object) As Boolean
        Dim ret As Boolean = False
        If IsNumeric(ovalue) Then
            If [Double].Parse(Convert.ToString(ovalue)) >= 1000 AndAlso [Double].Parse(Convert.ToString(ovalue)) <= 5000 Then
                ret = True
            End If
        End If
        Return ret
    End Function
    Public Overrides Function ShowInDropDown(columnIndex As Integer, filteredInRowList As Integer()) As Boolean
        ' filteredInRowList引数はフィルターイン行リスト
        ' 条件に合うデータが存在する時のみ項目リストに表示
        If filteredInRowList Is Nothing Then
            For i As Integer = 0 To sv.RowCount - 1
                Dim value As Object = sv.GetValue(i, columnIndex)
                If value IsNot Nothing Then
                    If IsFilteredIn(value) Then
                        Return True
                    End If
                End If
            Next
        Else
            ' 現在の行リストが条件に合致するか確認
            For i As Integer = 0 To filteredInRowList.Length - 1
                Dim row As Integer = filteredInRowList(i)
                Dim value As Object = sv.GetValue(row, columnIndex)
                If value IsNot Nothing Then
                    If IsFilteredIn(value) Then
                        Return True
                    End If
                End If
            Next
        End If
        Return False
    End Function
    Public Overrides Function Filter(columnIndex As Integer) As Integer()
        Dim ar As New System.Collections.ArrayList()
        Dim val As Object
        For i As Integer = 0 To sv.RowCount - 1
            val = sv.GetValue(i, columnIndex)
            If IsFilteredIn(val) Then
                ar.Add(i)
                '条件に合致する行番号をリストに追加
            End If
        Next
        Return DirectCast(ar.ToArray(GetType(Int32)), Int32())
    End Function
    Public Overrides Function Serialize(w As System.Xml.XmlTextWriter) As Boolean
        w.WriteStartElement("CustomFilter")
        MyBase.Serialize(w)
        w.WriteEndElement()
        Return True
    End Function
    Public Overrides Function Deserialize(r As System.Xml.XmlNodeReader) As Boolean
        If r.NodeType = System.Xml.XmlNodeType.Element Then
            If r.Name.Equals("CustomFilter") Then
                MyBase.Deserialize(r)
            End If
        End If
        Return True
    End Function
End Class
'以下をコードビハインドに記述します
' 2列目にフィルタの列定義を作成
Dim fcd1 As New FarPoint.Win.Spread.FilterColumnDefinition(1,
    FarPoint.Win.Spread.FilterListBehavior.Custom Or FarPoint.Win.Spread.FilterListBehavior.Default)
' カスタムフィルタを列定義に追加
fcd1.Filters.Add(New CustomFilter() With {.SheetView = FpSpread1.Sheets(0)})
' 非表示フィルタの作成
Dim hideRowFilter As New FarPoint.Win.Spread.HideRowFilter(FpSpread1.Sheets(0))
hideRowFilter.AddColumn(fcd1)
FpSpread1.Sheets(0).RowFilter = hideRowFilter
' テストデータを設定
FpSpread1.Sheets(0).SetValue(0, 1, 999)
FpSpread1.Sheets(0).SetValue(1, 1, 1000)
FpSpread1.Sheets(0).SetValue(2, 1, 5000)
参照

 

 


© MESCIUS inc. All rights reserved.