Проблема сортировки столбца даты datagridview во время щелчка заголовка в vb.net - PullRequest
0 голосов
/ 07 августа 2020

Цитата

В vb. net один из столбцов в представлении сетки данных отображается как issue_date в формате dd / mm / yyyy, но когда я нажимаю на заголовок этот столбец он может сортировать только по столбцу по числовому значению c как я могу отсортировать по дате?

, что означает, что это 01/09 / 2010,02 / 09 / 2010,01 / 10/2010 теперь сортируется по

01.09.2010 01.10.2010 02.09.2010

Blockquote

как можно сортирую по дате:

09.01.2010 02.09.2010 01.10.2010

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Согласно вашему объяснению, тип вашего столбца - String. Неправильно ColumnType отображать Date, но у каждого свои причины . Однако в этом случае вам поможет приведенный ниже код: Обратите внимание, что в этом классе я контролирую даже тип 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

Использование:

Изменить Column1.Index на YourColumnOfDate.Index

Private Sub DataGridView1_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
    DataGridView1.Sort(New ColumnDateComparer(Column1.Index, SortOrder.Descending))
End Sub
0 голосов
/ 07 августа 2020

Ваши базовые данные, вероятно, не дата. Это нормально (создайте новый проект, дважды щелкните форму и вставьте его поверх события загрузки формы):

    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

Сохраните данные в DataTable. Сделайте столбец типа DateTime, Store DateTimes. Привяжите стол к сетке. Счастливые дни

Еще более счастливые дни, если вы добавите элемент типа DataSet в свой проект, затем откройте его, щелкните правой кнопкой мыши поверхность, добавьте DataTable, щелкните его правой кнопкой мыши, добавьте столбцы, установите имена и типы соответствующим образом. DataTables сделанные таким образом намного приятнее работать с

...