数据网格视图 vb.net 中标题单击期间的日期列排序问题



Blockquote

vb.net 数据网格视图中的一列显示为 dd/mm/yyyy 格式的issue_date,但是当我单击该列的标题时,它只能按数值按列排序如何根据日期排序?

这意味着当它是 01/09/2010,02/09/2010,01/10/2010 时,它现在按

2010/9/1 2010/10/1 2010/9/2

块引用

如何根据日期排序:

2010/9/1 2010/9/2 2010/10/1

根据你的解释,你的列类型是String。显示Date不是正确的ColumnType,但每个人都有自己的原因。但是,在这种情况下,下面的代码可以帮助您: 请注意,在此类中,我甚至控制类型也是Date(如果您决定更改ColumnType,但在这种情况下,列排序本身是自然的),而不仅仅是String

希望是你需要的

Private Class ColumnDateComparer
Implements System.Collections.IComparer
Private Direction As Integer = 1
Private Index As Integer = 0
Public Sub New(ByVal ColumnIndex As Integer, ByVal sortOrder As SortOrder)
Index = ColumnIndex
If sortOrder = SortOrder.Descending Then
Direction = -1
ElseIf sortOrder = SortOrder.Ascending Then
Direction = 1
End If
End Sub
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
Implements System.Collections.IComparer.Compare
Dim DgvR1 As DataGridViewRow = CType(x, DataGridViewRow)
Dim DgvR2 As DataGridViewRow = CType(y, DataGridViewRow)
Dim dt1 As Date
Dim dt2 As Date
Dim rObj1 As Object = DgvR1.Cells(Index).Value
Dim rObj2 As Object = DgvR2.Cells(Index).Value
If TypeOf (rObj1) Is Date Then dt1 = CDate(rObj1)
If TypeOf (rObj2) Is Date Then dt2 = CDate(rObj2)
If TypeOf (rObj1) Is String Then
Date.TryParse(DirectCast(rObj1, String), dt1)
End If
If TypeOf (rObj2) Is String Then
Date.TryParse(DirectCast(rObj2, String), dt2)
End If
Return dt1.CompareTo(dt2) * Direction
End Function
End Class

用法:

使用YourColumnOfDate.Index更改Column1.Index

Private Sub DataGridView1_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
DataGridView1.Sort(New ColumnDateComparer(Column1.Index, SortOrder.Descending))
End Sub

基础数据可能不是日期。这排序很好(创建一个新项目,双击表单并将其粘贴到表单加载事件之上):

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim dt As New DataTable
dt.Columns.Add("name")
dt.Columns.Add("Birthdate", GetType(DateTime))
dt.Rows.Add("John", New DateTime(2000, 1, 1))
dt.Rows.Add("Mary", New DateTime(1960, 1, 1))
dt.Rows.Add("Luke", New DateTime(1980, 1, 1))
Dim dgv As New DataGridView
Controls.Add(dgv)
dgv.Dock = DockStyle.Fill
dgv.DataSource = dt
End Sub

将数据存储在数据表中。使列的类型为日期时间,存储日期时间。将表绑定到网格。快乐的日子

如果您将 DataSet 类型的项添加到项目中,然后打开它,右键单击图面,添加 DataTable,右键单击它,添加列,相应地设置名称和类型,那就更快乐了。以这种方式制作的数据表使用起来要好得多

最新更新