|
カスタムフィルタ
フィルタリングする条件を独自にカスタマイズすることができます。
カスタム フィルタを作成するには、次の手順に従います。
1 |
FarPoint.Web.Spread.BaseFilterItem または FarPoint.Web.Spread.DefaultFilterItem から継承したクラスを作成します。
|
2 |
フィルタ項目のドロップダウン リストに表示する名前を返すように、DisplayName プロパティをオーバーライドします。
|
3 |
ShowInDropDown メソッドをオーバーライドして、フィルタ条件に合致した現在の行に対し、このフィルタ項目をドロップダウン リストに表示するかどうかを指定します。
|
4 |
指定の列に対してフィルタ アクションを実行するように、Filter メソッドをオーバーライドします。
|
5 |
シリアル化の必要なデータがカスタム フィルタ クラスに含まれる場合は、Serialize および Deserialize メソッドをオーバーライドします。
|
6 |
HideRowFilter または StyleRowFilter オブジェクトを作成します。
|
7 |
手順6で作成した行フィルタ オブジェクトのカスタム列フィルタ定義リストに、作成したカスタム フィルタを追加します。
|
このサンプルでは「1000以上5000以下」の数値データのみ表示するMyCustomFilterを作成しています。
MyCustomFilter クラスは FarPoint.Web.Spread.DefaultFilterItem クラスを継承します。
また、MyCustomFilter クラスでは シートのデータを参照し1000以上5000以下という条件に合致するか調べます。
そのために対象となる Sheet オブジェクトへの参照を格納するためにメンバ変数 「sv」を持ちます。
| 製品ID | 製品分類 | 製品名 | 第1Q | 第2Q | 第3Q | 第4Q |
| | | | | | |
1 | 10001 | 乳製品 | 酪農ミルク | 5,500 | 5,000 | 4,500 | 6,000 |
2 | 20001 | 清涼飲料水 | いよかんドリンク | 1,000 | 3,000 | 2,700 | 2,700 |
3 | 20002 | 清涼飲料水 | ぶどうジュース | 3,000 | 3,500 | 4,800 | 4,800 |
4 | 20003 | 清涼飲料水 | マンゴードリンク | 2,000 | 1,000 | 500 | 1,050 |
5 | 30001 | ビール | 激辛ビール | 5,500 | 8,000 | 8,500 | 10,000 |
6 | 30002 | ビール | モルトビール | 3,000 | 3,500 | 2,780 | 4,000 |
7 | 20004 | 清涼飲料水 | ぶどうの街 | 500 | 300 | 200 | 700 |
8 | 30003 | ビール | オリエントの村 | 8,000 | 9,500 | 9,580 | 9,000 |
9 | 40002 | 焼酎 | 吟醸 ほめごろし | 6,000 | 7,000 | 9,000 | 9,500 |
10 | 40003 | 焼酎 | 大吟醸 オリエント | 1,000 | 5,000 | 6,000 | 5,000 |
11 | 40005 | 焼酎 | 麦焼酎 ちこちこ | 1,000 | 1,500 | 1,200 | 1,258 |
12 | 10002 | 乳製品 | 酪農ミルク(低脂肪) | 501 | 202 | 380 | 456 |
|
ソースコード
別ウィンドウで表示
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>
|
|