2016-08-05 32 views
1

日付の列を持つフォームにデータグリッドビューがあり、並べ替えボタンを押したときに列を並べ替えたいと思います。ここでカスタムIComparerを使用して日付列でDataGridViewを並べ替える

は、ボタンのクリックイベントのコードです:

Private Sub DateOfBirthSortButton_Click(sender As Object, e As EventArgs) Handles DateOfBirthSortButton.Click 
    PatientDataGridView.Sort(New DatabaseModule.DateComparer) 
End Sub 

と比較演算子のために:

Public outputFile As String = "C:\Users\Patrick\Desktop\outputTest.txt" 

Public Class DateComparer 
    Implements IComparer 

    ' Compare the two dates 
    Public Function Compare(ByVal rowX As Object, ByVal rowY As Object) As Integer Implements System.Collections.IComparer.Compare 

     'Get the date value from the collection of cells in the row 
     Dim dateX As String = rowX.Cells.Item(2).Value.ToString 
     Dim dateY As String = rowX.Cells.Item(2).Value.ToString 

     'Convert to a date 
     Dim x As Date = DateTime.ParseExact(dateX, "dd-MM-yyyy", Nothing) 
     Dim y As Date = DateTime.ParseExact(dateX, "dd-MM-yyyy", Nothing) 

     'Compare 
     Dim cmpDate As Integer = Date.Compare(x, y) 

     Dim objWriter As New System.IO.StreamWriter(outputFile, True) 

     objWriter.WriteLine(dateX & " " & dateY & " " & cmpDate) 
     objWriter.Close() 

     Return cmpDate 

    End Function 
End Class 

私はそのように、テキストファイルに比較演算の結果を置くのコードを追加しました私は各比較の結果を見ることができました。

しかし、ボタンを押すと、比較者は同じ行を一見ランダムな順序で、場合によっては複数回だけ比較します。ソートボタンが押された後

Initial ordering

得られた順序:

ここ

は、最初の注文(私は人々に彼らがに並べ替えるべき順序表示する数字を与えてくれた)でありますテキストファイルに記録さ

Resultant ordering

や比較:

Text file results

誰もが、私は非常に感謝される私の問題を修正することができますどのように私に感謝:)

+0

をデータがDGVに手に入れたどのように?それは完全に日付をすべて並べ替えることができます – Plutonix

答えて

1

を説明することができれば、短い答えは、あなたがコピー&ペーストのエラーを持っているということです。

Dim dateX As String = rowX.Cells.Item(2).Value.ToString 
' note that DateY is also getting from RowX 
' should be   rowY 
Dim dateY As String = rowX.Cells.Item(2).Value.ToString 

それらをキャストすることなく、また、Option Strictをオンにする必要がありrowXrowYObjectとして渡されていますがDataGridViewRowsとしてそれらを使用している:

Public Function Compare(X As Object, Y As Object) ... 
    Dim rowX = TryCast(X, DataGridViewRow) 

カスタムソーターが必要な場合は、コンストラクタで列と並べ替え順序を許可するように記述して、1つ以上の列で機能し、昇順から降順に戻って戻ることができます。例:それはあなたがソーターを使用できるようになりますので

' specify the column to sort, and the order: 
dgv1.Sort(New DGVPatientSorter(2, thisOrder)) 

、データがバインドされてはなりません。残念な。しかし、あなたがDateタイプとしてその列を定義した場合、それだけで罰金の日付をソートします:

dgv1.Columns(2).ValueType = GetType(DateTime) 

を次に並べ替え:

dgv1.Sort(dgv1.Columns(2), ListSortDirection.Ascending) 
+0

私はそんなにばかげています:Pありがとう –

+0

あなたはDGVにそれが日付列であると言うなら、あなたは本当にそれを必要としません – Plutonix

+0

どうすればいいですか?私は列のコレクションのプロパティを調べ、オプションを見つけることができませんでした。 –

関連する問題