Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用自定义IComparer按日期列对DataGridView进行排序_.net_Vb.net_Sorting - Fatal编程技术网

.net 使用自定义IComparer按日期列对DataGridView进行排序

.net 使用自定义IComparer按日期列对DataGridView进行排序,.net,vb.net,sorting,.net,Vb.net,Sorting,我在带有日期列的表单上有一个数据网格视图,我希望在按下排序按钮时对该列进行排序 以下是按钮单击事件的代码: Private Sub DateOfBirthSortButton_Click(sender As Object, e As EventArgs) Handles DateOfBirthSortButton.Click PatientDataGridView.Sort(New DatabaseModule.DateComparer) End Sub 对于比较器: Public o

我在带有日期列的表单上有一个数据网格视图,我希望在按下排序按钮时对该列进行排序

以下是按钮单击事件的代码:

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
我添加了代码,将比较器的结果放入文本文件中,以便查看每次比较的结果

但是,当按下按钮时,比较器仅以看似随机的顺序将同一行与自身进行比较,有时是多次比较

以下是初始顺序(我已经给出了人员编号,以显示他们应该按哪个顺序排序):

以及按下排序按钮后的结果顺序:

以及文本文件中记录的比较:


如果有人能向我解释如何解决我的问题,我将非常感激,谢谢:)

简单的回答是,您有一个复制粘贴错误:

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
您还应该启用
选项Strict
rowX
rowY
作为
对象传递,但您将它们用作
DataGridViewRows
,而不强制转换它们:

Public Function Compare(X As Object, Y As Object) ...
    Dim rowX = TryCast(X, DataGridViewRow)
如果/当您确实需要自定义排序器时,您可能希望编写它以允许构造函数中的列和排序顺序,这样它就可以处理多个列,并且能够从升序到降序再返回。例如:

' 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)

数据是如何进入DGV的?它完全能够自己对日期进行排序如果你告诉DGV它是一个日期列,那么你真的不需要它,那么我该怎么做呢?我查看了列集合的属性,但找不到选项。答案是-由于某些原因,您无法在列设计器中执行此操作
dgv1.Columns(2).ValueType=GetType(DateTime)
啊,对不起,还没有完全阅读完你的答案:D谢谢你的帮助,现在可以正常工作了:)如果你将它设置为DateTime,并且仍然保留分类器,你可以使用
DirectCast
而不是parse