独自のソートロジックで行を並び替えたい
対象製品
SPREAD for Windows Forms 7.0J
詳細
データの比較方法を定義するためにIComparerの実装クラスを作成し、当オブジェクトを指定してシートのSortRowsメソッドを実行します。
下記では文字列データの並び替えにて英大文字を英小文字の前に並べます。
◎サンプルコード(VB)
◎サンプルコード(C#)
下記では文字列データの並び替えにて英大文字を英小文字の前に並べます。
◎サンプルコード(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
' 自動ソートを許可
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;
}
}
{
// 自動ソートを許可
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;
}
}
関連情報
- 自動ソート実行時に複数のソート条件を指定する方法
- 複数のソート条件を指定することは出来ますか?
- 列ソートを行ってもデータモデルの並び順が変更されません(ソートした並びでExcelファイルにエクスポートされません)
- 行連結した列ヘッダにソートインジケーターが表示されません。また、ソートインジケーターの表示/非表示を制御することは出来ますか?
- 結合セルが含まれるスプレッドシートでは並べ替えを実行できませんが、対応方法はありますか?
キーワード
「ソート」