SPREAD for Windows Forms 10.0J サンプルコード集
独自のフィルタリング条件を作成する(既存クラスの継承)

基本的な行フィルタリング機能では対象列上に存在する各セルデータを基にして行いますが、既存のカスタムフィルタ用基本クラス(BaseFilterItemクラス)を継承したサブクラスを作成することで、例えばある範囲内のデータのみをフィルタリングするような条件を作成することができます。

※このサンプルはシートのAutoFilterModeがFilterGadgetに設定されている場合のみ有効です。

【実行例】

独自のフィルタリング条件

  • 既存クラスの継承は.NETアプリケーション開発における一般的な手法です。継承方法の詳細についてはMSDNライブラリをご参照ください。
  • 本サンプルは基本的な継承例です。実際にはプロジェクトの仕様に基づいた各カスタマイズが必要となります。
  • シート上にてフィルタリングされた行は一時的に非表示となるだけで、実際のデータには影響を与えません。そのため、Excelファイルへのエクスポート時には全ての行情報が出力されます。

 private void Form1_Load(object sender, System.EventArgs e)
 {

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

    '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

 

 


© 2004-2017, GrapeCity inc. All rights reserved.