.netwinformsdatagridview

DataGridView sorting with nulls in DateTime column


I've got a DataGridView control in a Windows forms application. There are four columns with string data and three with DateTime data. I'm adding the rows programmatically using the Rows.Add() method. All of the columns have SortMode set to Automatic. Clicking the column headers to sort just works, except for the one DateTime column that has some nulls. When the user clicks that column's header, it throws an ArgumentException: Object must be of type DateTime.

I know the hard way to get around this: setting all of the SortModes to NotSortable, handling the ColumnHeaderMouseClick event and sorting the whole thing manually. I'm looking for the easy way.

Is there a property or something I can set, or some other relatively simple way to allow this column to sort with nulls in it?


Solution

  • Here's the solution I came up with. The DataGridView raises a SortCompare event that you can use to input custom sorting. I'm handling that event and making null values sort out higher than non-null values (you could just as easily make nulls lower than non-nulls). Here's the VB code. I'm assuming every cell value is IComparable (if not it will be handled by the normal error handling logic.)

    Try
        If e.CellValue1 Is Nothing OrElse e.CellValue1.Equals(DBNull.Value) Then
            If e.CellValue2 Is Nothing OrElse e.CellValue2.Equals(DBNull.Value) Then
                e.SortResult = 0
            Else
                e.SortResult = 1
            End If
        Else
            If e.CellValue2 Is Nothing OrElse e.CellValue2.Equals(DBNull.Value) Then
                e.SortResult = -1
            Else
                e.SortResult = DirectCast(e.CellValue1, IComparable).CompareTo(DirectCast(e.CellValue2, IComparable))
            End If
        End If
        e.Handled = True
    Catch ex As Exception
        HandleError("Error sorting result grid values", ex)
        Close()
    End Try
    

    If anybody has any improvements on this please feel free to post them.