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