MESCIUS SPREAD for Windows Forms 17.0J サンプルコード集 > 行フィルタリング > 独自のフィルタリング条件を作成する(既存クラスの継承) |
基本的な行フィルタリング機能では対象列上に存在する各セルデータを基にして行いますが、既存のカスタムフィルタ用基本クラス(BaseFilterItemクラス)を継承したサブクラスを作成することで、例えばある範囲内のデータのみをフィルタリングするような条件を作成することができます。
※このサンプルはシートのAutoFilterModeがFilterGadgetに設定されている場合のみ有効です。
|
private void Form1_Load(object sender, System.EventArgs e) { //自動フィルタのフィルタガジェットを表示します fpSpread1.ActiveSheet.AutoFilterMode = FarPoint.Win.Spread.AutoFilterMode.FilterGadget; //1列目には作成したカスタムフィルタのみを表示させるようにします FarPoint.Win.Spread.FilterColumnDefinition fcd = new FarPoint.Win.Spread.FilterColumnDefinition(0, FarPoint.Win.Spread.FilterListBehavior.Custom); FarPoint.Win.Spread.HideRowFilter hf = new FarPoint.Win.Spread.HideRowFilter(fpSpread1.ActiveSheet); hf.AddColumn(fcd); fpSpread1.ActiveSheet.RowFilter = hf; //1列目に作成したカスタムフィルターを追加します CustomFilter cfi = new CustomFilter(fpSpread1.ActiveSheet); FarPoint.Win.Spread.FilterColumnDefinition ccd = fpSpread1.ActiveSheet.RowFilter.GetFilterColumnDefinition(0); ccd.Filters.Add(cfi); fpSpread1.ActiveSheet.DefaultStyle.CellType = new FarPoint.Win.Spread.CellType.NumberCellType(); fpSpread1.ActiveSheet.SetValue(0, 0, 10); fpSpread1.ActiveSheet.SetValue(1, 0, 100); fpSpread1.ActiveSheet.SetValue(2, 0, 50); fpSpread1.ActiveSheet.SetValue(3, 0, 40); fpSpread1.ActiveSheet.SetValue(4, 0, 80); fpSpread1.ActiveSheet.SetValue(5, 0, 1); fpSpread1.ActiveSheet.SetValue(6, 0, 65); fpSpread1.ActiveSheet.SetValue(7, 0, 20); fpSpread1.ActiveSheet.SetValue(8, 0, 30); fpSpread1.ActiveSheet.SetValue(9, 0, 35); }
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load '自動フィルタのフィルタガジェットを表示します FpSpread1.ActiveSheet.AutoFilterMode = FarPoint.Win.Spread.AutoFilterMode.FilterGadget '1列目には作成したカスタムフィルタのみを表示させるようにします Dim fcd As New FarPoint.Win.Spread.FilterColumnDefinition(0, FarPoint.Win.Spread.FilterListBehavior.Custom) Dim hf As New FarPoint.Win.Spread.HideRowFilter(FpSpread1.ActiveSheet) hf.AddColumn(fcd) FpSpread1.ActiveSheet.RowFilter = hf '1列目に作成したカスタムフィルターを追加します Dim cfi As New CustomFilter(FpSpread1.ActiveSheet) Dim ccd As FarPoint.Win.Spread.FilterColumnDefinition = FpSpread1.ActiveSheet.RowFilter.GetFilterColumnDefinition(0) ccd.Filters.Add(cfi) FpSpread1.ActiveSheet.DefaultStyle.CellType = New FarPoint.Win.Spread.CellType.NumberCellType FpSpread1.ActiveSheet.SetValue(0, 0, 10) FpSpread1.ActiveSheet.SetValue(1, 0, 100) FpSpread1.ActiveSheet.SetValue(2, 0, 50) FpSpread1.ActiveSheet.SetValue(3, 0, 40) FpSpread1.ActiveSheet.SetValue(4, 0, 80) FpSpread1.ActiveSheet.SetValue(5, 0, 1) FpSpread1.ActiveSheet.SetValue(6, 0, 65) FpSpread1.ActiveSheet.SetValue(7, 0, 20) FpSpread1.ActiveSheet.SetValue(8, 0, 30) FpSpread1.ActiveSheet.SetValue(9, 0, 35) End Sub
[Serializable()] public class CustomFilter : FarPoint.Win.Spread.BaseFilterItem //BaseFilterItemクラスを継承したサブクラスを作成します { FarPoint.Win.Spread.SheetView sv = null; public CustomFilter(): base() { } public CustomFilter(FarPoint.Win.Spread.SheetView sheetView): base() { this.sv = sheetView; } //--------------------------------------------------------- //ドロップダウンリストに表示する名称を返します //--------------------------------------------------------- public override string DisplayName { get { return "10以上50以下の値を抽出"; } } //----------------------------------------------------------------------------------------- //シートをフィルタに設定します //----------------------------------------------------------------------------------------- public override FarPoint.Win.Spread.SheetView SheetView { set { sv = value; } } //----------------------------------------------------------------------------------------- //指定された値を独自の条件によって判断します //----------------------------------------------------------------------------------------- public bool IsFilteredIn(int value) { if (!((object)value == null) && (value >= 10) && (value <= 50)) { //以下の条件が成立する場合のみTrueを返します // (1)値が入力されている // (2)値が10以上である // (3)値が50以下である return true; } return false; } //----------------------------------------------------------------------------------------- //DisplayNameプロパティによって返された名称を表示します //----------------------------------------------------------------------------------------- public override bool ShowInDropDown(int columnIndex, int[] filteredInRowList) { return true; } //----------------------------------------------------------------------------------------- //シートの指定した列でフィルタリングを実行します //----------------------------------------------------------------------------------------- public override int[] Filter(int columnIndex) { ArrayList list = new ArrayList(); int[] returnList = null; int row; if (sv == null) { return returnList; } for (row = 0; row <= (sv.RowCount - 1); row++) { if ((object)sv.GetValue(row, columnIndex) != null) { int value = (int)sv.GetValue(row, columnIndex); if (IsFilteredIn(value)) { //条件に一致した行インデックスを順次追加します list.Add(row); } } } //条件に一致した行が存在する場合は配列にコピーします if (list.Count > 0) { returnList = new int[list.Count]; list.CopyTo(returnList); list.Clear(); } //条件に一致した全ての行インデックスを返します return returnList; } //----------------------------------------------------------------------------------------- //シリアル化の必要なデータがカスタムフィルタクラスに含まれる場合はオーバーライドします //----------------------------------------------------------------------------------------- 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; } }
Public Class CustomFilter 'BaseFilterItemクラスを継承したサブクラスを作成します Inherits FarPoint.Win.Spread.BaseFilterItem Dim sv As FarPoint.Win.Spread.SheetView = Nothing Public Sub New() End Sub Public Sub New(ByVal sheetView As FarPoint.Win.Spread.SheetView) Me.sv = sheetView End Sub '--------------------------------------------------------- 'ドロップダウンリストに表示する名称を返します '--------------------------------------------------------- Public Overrides ReadOnly Property DisplayName() As String Get Return "10以上50以下の値を抽出" End Get End Property '----------------------------------------------------------------------------------------- 'シートをフィルタに設定します '----------------------------------------------------------------------------------------- Public Overrides WriteOnly Property SheetView() As FarPoint.Win.Spread.SheetView Set(ByVal Value As FarPoint.Win.Spread.SheetView) sv = Value End Set End Property '----------------------------------------------------------------------------------------- '指定された値を独自の条件によって判断します '----------------------------------------------------------------------------------------- Public Function IsFilteredIn(ByVal value As Integer) As Boolean If Not (value = Nothing) And (value >= 10) And (value <= 50) Then '以下の条件が成立する場合のみTrueを返します ' (1)値が入力されている ' (2)値が10以上である ' (3)値が50以下である Return True End If Return False End Function '----------------------------------------------------------------------------------------- 'DisplayNameプロパティによって返された名称を表示します '----------------------------------------------------------------------------------------- Public Overrides Function ShowInDropDown(ByVal columnIndex As Integer, ByVal filteredInRowList() As Integer) As Boolean Return True End Function '----------------------------------------------------------------------------------------- 'シートの指定した列でフィルタリングを実行します '----------------------------------------------------------------------------------------- Public Overrides Function Filter(ByVal columnIndex As Integer) As Integer() Dim list As New ArrayList Dim returnList As Integer() = Nothing Dim row As Integer If (sv Is Nothing) Then Return returnList End If For row = 0 To sv.RowCount - 1 If Not (sv.GetValue(row, columnIndex) = Nothing) Then Dim value As Integer = sv.GetValue(row, columnIndex) If IsFilteredIn(value) Then '条件に一致した行インデックスを順次追加します list.Add(row) End If End If Next row '条件に一致した行が存在する場合は配列にコピーします If list.Count > 0 Then returnList = New Integer(list.Count -1) {} list.CopyTo(returnList) list.Clear() End If '条件に一致した全ての行インデックスを返します Return returnList End Function '----------------------------------------------------------------------------------------- 'シリアル化の必要なデータがカスタムフィルタクラスに含まれる場合はオーバーライドします '----------------------------------------------------------------------------------------- Public Overrides Function Serialize(ByVal w As System.Xml.XmlTextWriter) As Boolean w.WriteStartElement("CustomFilter") MyBase.Serialize(w) w.WriteEndElement() Return True End Function Public Overrides Function Deserialize(ByVal 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