カスタムフィルタ

フィルタリングする条件を独自にカスタマイズすることができます。
カスタム フィルタを作成するには、次の手順に従います。

FarPoint.Web.Spread.BaseFilterItem または FarPoint.Web.Spread.DefaultFilterItem から継承したクラスを作成します。
フィルタ項目のドロップダウン リストに表示する名前を返すように、DisplayName プロパティをオーバーライドします。
ShowInDropDown メソッドをオーバーライドして、フィルタ条件に合致した現在の行に対し、このフィルタ項目をドロップダウン リストに表示するかどうかを指定します。
指定の列に対してフィルタ アクションを実行するように、Filter メソッドをオーバーライドします。
シリアル化の必要なデータがカスタム フィルタ クラスに含まれる場合は、Serialize および Deserialize メソッドをオーバーライドします。
HideRowFilter または StyleRowFilter オブジェクトを作成します。
手順6で作成した行フィルタ オブジェクトのカスタム列フィルタ定義リストに、作成したカスタム フィルタを追加します。

このサンプルでは「1000以上5000以下」の数値データのみ表示するMyCustomFilterを作成しています。
MyCustomFilter クラスは FarPoint.Web.Spread.DefaultFilterItem クラスを継承します。
また、MyCustomFilter クラスでは シートのデータを参照し1000以上5000以下という条件に合致するか調べます。
そのために対象となる Sheet オブジェクトへの参照を格納するためにメンバ変数 「sv」を持ちます。
 製品ID製品分類製品名第1Q第2Q第3Q第4Q
   
110001乳製品酪農ミルク5,5005,0004,5006,000
220001清涼飲料水いよかんドリンク1,0003,0002,7002,700
320002清涼飲料水ぶどうジュース3,0003,5004,8004,800
420003清涼飲料水マンゴードリンク2,0001,0005001,050
530001ビール激辛ビール5,5008,0008,50010,000
630002ビールモルトビール3,0003,5002,7804,000
720004清涼飲料水ぶどうの街500300200700
830003ビールオリエントの村8,0009,5009,5809,000
940002焼酎吟醸 ほめごろし6,0007,0009,0009,500
1040003焼酎大吟醸 オリエント1,0005,0006,0005,000
1140005焼酎麦焼酎 ちこちこ1,0001,5001,2001,258
1210002乳製品酪農ミルク(低脂肪)501202380456

ソースコード

別ウィンドウで表示
using System;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Configuration;

public partial class customfilter : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (IsPostBack) return;

        // SPREADの設定
        InitSpread(FpSpread1);

        // シートの設定
        InitSheet(FpSpread1.Sheets[0]);
    }

    private void InitSpread(FarPoint.Web.Spread.FpSpread spread)
    {
        // データ連結
        DataSet ds = new DataSet();
        ds.ReadXml(MapPath("../App_Data/datanum2.xml"));
        FpSpread1.DataSource = ds;

        // SPREAD設定
        spread.CommandBar.Visible = false;
        spread.CssClass = "spreadStyle";
        spread.UseClipboard = false;
    }

    private void InitSheet(FarPoint.Web.Spread.SheetView sheet)
    {
        // フォントサイズの設定
        sheet.DefaultStyle.Font.Size = FontUnit.Parse("80%");
        sheet.ColumnHeader.DefaultStyle.Font.Size = FontUnit.Parse("80%");
        sheet.RowHeader.DefaultStyle.Font.Size = FontUnit.Parse("80%");
        sheet.SheetCorner.DefaultStyle.Font.Size = FontUnit.Parse("80%");

        // シート設定
        sheet.PageSize = sheet.RowCount;
        sheet.OperationMode = FarPoint.Web.Spread.OperationMode.SingleSelect;

        // 列幅の設定
        sheet.Columns[0].Width = 45;
        sheet.Columns[1].Width = 85;
        sheet.Columns[2].Width = 135;
        sheet.Columns[3].Width = 80;
        sheet.Columns[4].Width = 80;
        sheet.Columns[5].Width = 80;
        sheet.Columns[6].Width = 80;

        // 縦方向の揃え位置を中央に設定
        sheet.DefaultStyle.VerticalAlign = VerticalAlign.Middle;

        // 各列のセル型を設定
        FarPoint.Web.Spread.GeneralCellType gnr = new FarPoint.Web.Spread.GeneralCellType();
        gnr.FormatString = "#,##0";
        sheet.Columns[3, 6].CellType = gnr;
        sheet.Columns[3, 6].HorizontalAlign = HorizontalAlign.Right;
        sheet.Columns[0, 2].Locked = true;

        sheet.ColumnHeaderAutoTextIndex = 0;
        sheet.ColumnHeader.RowCount = 2;

        // フィルターを設定
        FarPoint.Web.Spread.HideRowFilter hf;
        MyCustomFilter mc;
        FarPoint.Web.Spread.FilterColumnDefinition fcd;
        hf = new FarPoint.Web.Spread.HideRowFilter(sheet); //非表示フィルタの作成
        mc = new MyCustomFilter(); //カスタムフィルタを作成
        mc.SheetView = sheet; //シートの設定

        // 4列目~7列目にカスタムフィルタを設定
        for (int i = 0; i < 4; i++)
        {
            fcd = new FarPoint.Web.Spread.FilterColumnDefinition(i + 3, FarPoint.Web.Spread.FilterListBehavior.Custom); 
            fcd.Filters.Add(mc); //カスタムフィルタを定義に追加
            hf.AddColumn(fcd); //フィルタ定義を非表示フィルタに追加            
        }

        sheet.RowFilter = hf; //フィルタをシートに設定; 
    }
}

[Serializable()]
public class MyCustomFilter : FarPoint.Web.Spread.DefaultFilterItem
{
    FarPoint.Web.Spread.SheetView sv = null;

    public MyCustomFilter() { }
    public override string DisplayName
    {
        get { return "1000~5000"; }//フィルタに表示する文字列
    }
    public override FarPoint.Web.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 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 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 bool Serialize(System.Xml.XmlTextWriter w)
    {
        w.WriteStartElement("MyCustomFilter");
        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("MyCustomFilter"))
                base.Deserialize(r);
        }
        return true;
    }
}

Partial Public Class customfilter
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If IsPostBack Then
            Return
        End If

        ' SPREADの設定
        InitSpread(FpSpread1)

        ' シートの設定
        InitSheet(FpSpread1.Sheets(0))
    End Sub

    Private Sub InitSpread(ByVal spread As FarPoint.Web.Spread.FpSpread)
        ' データ連結
        Dim ds As New System.Data.DataSet()
        ds.ReadXml(MapPath("../App_Data/datanum2.xml"))
        FpSpread1.DataSource = ds

        ' SPREAD設定
        spread.CommandBar.Visible = False
        spread.CssClass = "spreadStyle"
        spread.UseClipboard = False
    End Sub

    Private Sub InitSheet(ByVal sheet As FarPoint.Web.Spread.SheetView)
        ' フォントサイズの設定
        sheet.DefaultStyle.Font.Size = FontUnit.Parse("80%")
        sheet.ColumnHeader.DefaultStyle.Font.Size = FontUnit.Parse("80%")
        sheet.RowHeader.DefaultStyle.Font.Size = FontUnit.Parse("80%")
        sheet.SheetCorner.DefaultStyle.Font.Size = FontUnit.Parse("80%")

        ' シート設定
        sheet.PageSize = sheet.RowCount
        sheet.OperationMode = FarPoint.Web.Spread.OperationMode.SingleSelect

        ' 列幅の設定
        sheet.Columns(0).Width = 45
        sheet.Columns(1).Width = 85
        sheet.Columns(2).Width = 135
        sheet.Columns(3).Width = 80
        sheet.Columns(4).Width = 80
        sheet.Columns(5).Width = 80
        sheet.Columns(6).Width = 80

        ' 縦方向の揃え位置を中央に設定
        sheet.DefaultStyle.VerticalAlign = VerticalAlign.Middle

        ' 各列のセル型を設定
        Dim gnr As New FarPoint.Web.Spread.GeneralCellType()
        gnr.FormatString = "#,##0"
        sheet.Columns(3, 6).CellType = gnr
        sheet.Columns(3, 6).HorizontalAlign = HorizontalAlign.Right
        sheet.Columns(0, 2).Locked = True

        sheet.ColumnHeaderAutoTextIndex = 0
        sheet.ColumnHeader.RowCount = 2

        ' フィルターを設定
        Dim hf As FarPoint.Web.Spread.HideRowFilter
        Dim mc As MyCustomFilter
        Dim fcd As FarPoint.Web.Spread.FilterColumnDefinition
        '非表示フィルタの作成
        hf = New FarPoint.Web.Spread.HideRowFilter(sheet)
        'カスタムフィルタを作成
        mc = New MyCustomFilter()
        'シートの設定
        mc.SheetView = sheet

        ' 4列目~7列目にカスタムフィルタを設定
        For i As Integer = 0 To 3
            fcd = New FarPoint.Web.Spread.FilterColumnDefinition(i + 3, FarPoint.Web.Spread.FilterListBehavior.[Custom])
            'カスタムフィルタを定義に追加
            fcd.Filters.Add(mc)
            'フィルタ定義を非表示フィルタに追加            
            hf.AddColumn(fcd)
        Next

        sheet.RowFilter = hf 'フィルタをシートに設定 
    End Sub
End Class

<Serializable()> _
Public Class MyCustomFilter
    Inherits FarPoint.Web.Spread.DefaultFilterItem
    Private sv As FarPoint.Web.Spread.SheetView = Nothing

    Public Sub New()
    End Sub
    Public Overloads Overrides ReadOnly Property DisplayName() As String
        Get
            Return "1000~5000"
        End Get
    End Property
    'フィルタに表示する文字列
    Public Overloads Overrides WriteOnly Property SheetView() As FarPoint.Web.Spread.SheetView
        Set(ByVal value As FarPoint.Web.Spread.SheetView)
            sv = value
        End Set
    End Property
    Private Function IsNumeric(ByVal 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(ByVal 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 Overloads Overrides Function Filter(ByVal 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 Overloads Overrides Function ShowInDropDown(ByVal columnIndex As Integer, _
                                                       ByVal 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 Overloads Overrides Function Serialize(ByVal w As System.Xml.XmlTextWriter) As Boolean
        w.WriteStartElement("MyCustomFilter")
        MyBase.Serialize(w)
        w.WriteEndElement()
        Return True
    End Function
    Public Overloads Overrides Function Deserialize(ByVal r As System.Xml.XmlNodeReader) As Boolean
        If r.NodeType = System.Xml.XmlNodeType.Element Then
            If r.Name.Equals("MyCustomFilter") Then
                MyBase.Deserialize(r)
            End If
        End If
        Return True
    End Function
End Class

<%@ Page MasterPageFile="~/MasterPage.master" Language="c#" AutoEventWireup="true" 
         Inherits="customfilter" CodeFile="customfilter.aspx.cs" %>

<%@ Register Assembly="FarPoint.Web.SpreadJ" Namespace="FarPoint.Web.Spread" TagPrefix="FarPoint" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    <FarPoint:FpSpread ID="FpSpread1" runat="server" BorderColor="#A0A0A0" BorderStyle="Solid"
        BorderWidth="1px">
        <CommandBar BackColor="#F6F6F6" ButtonFaceColor="Control" ButtonHighlightColor="ControlLightLight"
            ButtonShadowColor="ControlDark">
        </CommandBar>
        <Sheets>
            <FarPoint:SheetView SheetName="Sheet1">
            </FarPoint:SheetView>
        </Sheets>
    </FarPoint:FpSpread>
</asp:Content>