作成日: 2014/01/20 最終更新日: 2014/01/20
文書種別
使用方法
詳細
非連結モードの場合、SortメソッドはString.Compareメソッドに準拠してソートが行われます※。
そのため、AddItemを用いて数値データを追加した場合、望む結果が得られない場合があります。
※製品ヘルプの「タスク別ヘルプ > ソート > ソート順序について」で説明しています。
数値としてソートした結果を得るには、次のいずれかの方法が考えられます。
(I) データをInteger型に変換した上でソートを実行
◇サンプルコード
----------------
C1FlexGrid1.Rows.Count = 1
C1FlexGrid1.Cols.Fixed = 0
C1FlexGrid1.AddItem("1")
C1FlexGrid1.AddItem("2")
C1FlexGrid1.AddItem("3")
C1FlexGrid1.AddItem("4")
C1FlexGrid1.AddItem("5")
C1FlexGrid1.AddItem("10")
C1FlexGrid1.AddItem("11")
C1FlexGrid1.AddItem("12")
C1FlexGrid1.AddItem("13")
C1FlexGrid1.AddItem("14")
C1FlexGrid1.AddItem("15")
C1FlexGrid1.AddItem("6")
C1FlexGrid1.AddItem("7")
C1FlexGrid1.AddItem("8")
C1FlexGrid1.AddItem("9")
Dim n As Integer
For n = 0 To 15
C1FlexGrid1.SetData(n, 0, Convert.ToInt32(C1FlexGrid1.Cols(0).Item(n)), True)
Next
C1FlexGrid1.Sort(SortFlags.Ascending, 0)
----------------
(II) IComparerインターフェイスを実装するカスタムクラスを作成して、値を整数型に変換した後に比較
◇サンプルコード
----------------
・・・(データ設定部分省略)・・・
C1FlexGrid1.Sort(New RowComparer(C1FlexGrid1, SortFlags.Ascending))
・・・(以下省略)・・・
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim s1 As String = _flex(DirectCast(x, Row).Index, 0).ToString()
Dim s2 As String = _flex(DirectCast(y, Row).Index, 0).ToString()
Dim int1 As Integer = CType(s1, Integer)
Dim int2 As Integer = CType(s2, Integer)
Dim _cmp As Integer
If _order = SortFlags.Ascending Then
If int1 > int2 Then
_cmp = 1
End If
If int1 < int2 Then
_cmp = -1
Else
_cmp = 0
End If
ElseIf _order = SortFlags.Descending Then
If int1 < int2 Then
_cmp = 1
End If
If int1 > int2 Then
_cmp = -1
Else
_cmp = 0
End If
End If
Return _cmp
End Function
そのため、AddItemを用いて数値データを追加した場合、望む結果が得られない場合があります。
※製品ヘルプの「タスク別ヘルプ > ソート > ソート順序について」で説明しています。
数値としてソートした結果を得るには、次のいずれかの方法が考えられます。
(I) データをInteger型に変換した上でソートを実行
◇サンプルコード
----------------
C1FlexGrid1.Rows.Count = 1
C1FlexGrid1.Cols.Fixed = 0
C1FlexGrid1.AddItem("1")
C1FlexGrid1.AddItem("2")
C1FlexGrid1.AddItem("3")
C1FlexGrid1.AddItem("4")
C1FlexGrid1.AddItem("5")
C1FlexGrid1.AddItem("10")
C1FlexGrid1.AddItem("11")
C1FlexGrid1.AddItem("12")
C1FlexGrid1.AddItem("13")
C1FlexGrid1.AddItem("14")
C1FlexGrid1.AddItem("15")
C1FlexGrid1.AddItem("6")
C1FlexGrid1.AddItem("7")
C1FlexGrid1.AddItem("8")
C1FlexGrid1.AddItem("9")
Dim n As Integer
For n = 0 To 15
C1FlexGrid1.SetData(n, 0, Convert.ToInt32(C1FlexGrid1.Cols(0).Item(n)), True)
Next
C1FlexGrid1.Sort(SortFlags.Ascending, 0)
----------------
(II) IComparerインターフェイスを実装するカスタムクラスを作成して、値を整数型に変換した後に比較
◇サンプルコード
----------------
・・・(データ設定部分省略)・・・
C1FlexGrid1.Sort(New RowComparer(C1FlexGrid1, SortFlags.Ascending))
・・・(以下省略)・・・
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim s1 As String = _flex(DirectCast(x, Row).Index, 0).ToString()
Dim s2 As String = _flex(DirectCast(y, Row).Index, 0).ToString()
Dim int1 As Integer = CType(s1, Integer)
Dim int2 As Integer = CType(s2, Integer)
Dim _cmp As Integer
If _order = SortFlags.Ascending Then
If int1 > int2 Then
_cmp = 1
End If
If int1 < int2 Then
_cmp = -1
Else
_cmp = 0
End If
ElseIf _order = SortFlags.Descending Then
If int1 < int2 Then
_cmp = 1
End If
If int1 > int2 Then
_cmp = -1
Else
_cmp = 0
End If
End If
Return _cmp
End Function
旧文書番号
80668