独自のソートロジックで行を並び替えたい

文書番号 : 33647     文書種別 : 使用方法     登録日 : 2012/11/14     最終更新日 : 2014/09/12
文書を印刷する
対象製品
SPREAD for Windows Forms 7.0J
詳細
データの比較方法を定義するためにIComparerの実装クラスを作成し、当オブジェクトを指定してシートのSortRowsメソッドを実行します。

下記では文字列データの並び替えにて英大文字を英小文字の前に並べます。

◎サンプルコード(VB)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  ' 自動ソートを許可
  FpSpread1.ActiveSheet.Columns(0).AllowAutoSort = True

  ' テストデータの設定
  FpSpread1.ActiveSheet.Cells(0, 0).Value = "C"
  FpSpread1.ActiveSheet.Cells(1, 0).Value = "b"
  FpSpread1.ActiveSheet.Cells(2, 0).Value = "D"
  FpSpread1.ActiveSheet.Cells(3, 0).Value = "a"
  FpSpread1.ActiveSheet.Cells(4, 0).Value = "B"
  FpSpread1.ActiveSheet.Cells(5, 0).Value = "A"
  FpSpread1.ActiveSheet.Cells(6, 0).Value = "d"
  FpSpread1.ActiveSheet.Cells(7, 0).Value = "c"
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  ' 独自ロジックでソート
  FpSpread1.ActiveSheet.SortRows(0, True, False, New MyStringComparer())
End Sub

Private Sub FpSpread1_AutoSortingColumn(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.AutoSortingColumnEventArgs) Handles FpSpread1.AutoSortingColumn
  Dim bAsc As Boolean = e.Ascending
  ' デフォルトのソートをキャンセル
  e.Cancel = True
  ' 独自ロジックでソート
  e.Sheet.SortRows(e.Column, bAsc, e.ShowIndicator, New MyStringComparer())
  bAsc = Not bAsc
End Sub

Public Class MyStringComparer
  Implements System.Collections.IComparer

  Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements Collections.IComparer.Compare
    Dim val1 As String = Convert.ToString(x)
    Dim val2 As String = Convert.ToString(y)

    Dim compareResult As Integer

    If val1 Is Nothing And val2 Is Nothing Then
      compareResult = String.Compare(val1, val2)
    ElseIf val1 Is Nothing And Not val2 Is Nothing Then
      compareResult = -1
    ElseIf Not val1 Is Nothing And val2 Is Nothing Then
      compareResult = 1
    ElseIf val1.Equals(val1.ToLower) And Not val2.Equals(val2.ToLower) Then
      '小文字の場合、小文字を後にする
      compareResult = 1
    ElseIf Not val1.Equals(val1.ToLower) And val2.Equals(val2.ToLower) Then
      '大文字の場合、大文字を先にする
      compareResult = -1
    Else
      '大文字と大文字、小文字と小文字の比較はデフォルトのString.Compareで処理
      compareResult = String.Compare(val1, val2, False)
    End If
    Return compareResult
  End Function
End Class


◎サンプルコード(C#)
private void button1_Click(object sender, EventArgs e)
{
  // 自動ソートを許可
  fpSpread1.ActiveSheet.Columns[0].AllowAutoSort = true;

  // テストデータの設定
  fpSpread1.ActiveSheet.Cells[0, 0].Value = "C";
  fpSpread1.ActiveSheet.Cells[1, 0].Value = "b";
  fpSpread1.ActiveSheet.Cells[2, 0].Value = "D";
  fpSpread1.ActiveSheet.Cells[3, 0].Value = "a";
  fpSpread1.ActiveSheet.Cells[4, 0].Value = "B";
  fpSpread1.ActiveSheet.Cells[5, 0].Value = "A";
  fpSpread1.ActiveSheet.Cells[6, 0].Value = "d";
  fpSpread1.ActiveSheet.Cells[7, 0].Value = "c";
}

private void button1_Click(object sender, EventArgs e)
{
  // 独自ロジックでソート
  fpSpread1.ActiveSheet.SortRows(0, true, false, new MyStringComparer());
}

void fpSpread1_AutoSortingColumn(object sender, FarPoint.Win.Spread.AutoSortingColumnEventArgs e)
{
  Boolean bAsc = e.Ascending;
  // デフォルトのソートをキャンセル
  e.Cancel = true;
  // 独自ロジックでソート
  e.Sheet.SortRows(e.Column, bAsc, e.ShowIndicator, new MyStringComparer());
  bAsc = !bAsc;
}

public class MyStringComparer : System.Collections.IComparer
{

  public int Compare(object x, object y)
  {
    string val1 = Convert.ToString(x);
    string val2 = Convert.ToString(y);

    int compareResult = 0;

    if (val1 == null & val2 == null)
    {
      compareResult = string.Compare(val1, val2);
    }
    else if (val1 == null & (val2 != null))
    {
      compareResult = -1;
    }
    else if ((val1 != null) & val2 == null)
    {
      compareResult = 1;
    }
    else if (val1.Equals(val1.ToLower()) & !val2.Equals(val2.ToLower()))
    {
      //小文字の場合、小文字を後にする
      compareResult = 1;
    }
    else if (!val1.Equals(val1.ToLower()) & val2.Equals(val2.ToLower()))
    {
      //大文字の場合、大文字を先にする
      compareResult = -1;
    }
    else
    {
      //大文字と大文字、小文字と小文字の比較はデフォルトのString.Compareで処理
      compareResult = string.Compare(val1, val2, false);
    }
    return compareResult;
  }
}
関連情報
キーワード
「ソート」