Сортировка DataGridView с нулями в столбце DateTime - PullRequest
3 голосов
/ 16 мая 2009

У меня есть элемент управления DataGridView в приложении форм Windows. Есть четыре столбца со строковыми данными и три столбца с данными DateTime. Я добавляю строки программно, используя метод Rows.Add (). Все столбцы имеют SortMode, установленный на Автоматический. Щелчок по заголовкам столбцов для сортировки работает, за исключением одного столбца DateTime, который имеет несколько нулей. Когда пользователь щелкает заголовок этого столбца, он создает исключение ArgumentException: объект должен иметь тип DateTime.

Мне известен трудный способ обойти это: установить все SortModes в NotSortable, обработать событие ColumnHeaderMouseClick и отсортировать все вручную. Я ищу легкий путь.

Есть ли свойство или что-то, что я могу установить, или какой-то другой относительно простой способ разрешить сортировку этого столбца с нулями в нем?

Ответы [ 5 ]

4 голосов
/ 02 марта 2011

Простым решением является добавление функции tonull, которую вы запускаете e.cellvalue1 и 2 каждый раз, когда производится сравнение. Если значение равно «», то значение ячейки будет изменено на 01.01.1001, если вы хотите, чтобы нулевые значения появлялись первыми в сортировке, или 01.013001 или что-то смехотворно высокое, если вы хотите, чтобы они появлялись последними в сортировке. сортировка.

Private Sub dgvTable_SortCompare(ByVal sender As Object, ByVal e As DataGridViewSortCompareEventArgs) Handles dgvTable.SortCompare

    If e.Column.Index = 4 Then

        e.SortResult = System.DateTime.Compare(todatenull(e.CellValue1), todatenull(e.CellValue2))

    End If

    e.Handled = True
End Sub


Function todatenull(ByVal cellvalue)
    If cellvalue = "" Then
        Return "01/01/1001"
    Else
        Return cellvalue
    End If
End Function
2 голосов
/ 18 мая 2009

Вот решение, которое я придумал. DataGridView вызывает событие SortCompare, которое можно использовать для ввода пользовательской сортировки. Я обрабатываю это событие и заставляю нулевые значения сортироваться выше, чем ненулевые значения (вы можете также легко сделать нулевые значения ниже, чем ненулевые) Вот код VB. Я предполагаю, что каждое значение ячейки является IComparable (в противном случае оно будет обрабатываться обычной логикой обработки ошибок.)

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

Если у кого-то есть улучшения по этому вопросу, пожалуйста, не стесняйтесь их публиковать.

1 голос
/ 16 мая 2009

Обновленный ответ : Посмотрев на ваш опубликованный ответ, я вижу, что вы проверяете DBNull.Value в ячейках. Это может быть источником вашей проблемы, поскольку DBNull.Value не может быть приведен к DateTime. Если вы программно добавляете строки, попробуйте заменить DBNull.Value на ноль (Nothing).


Оригинальный ответ : Попробуйте сделать это для каждого столбца, который содержит данные DateTime, предпочтительно до загрузки любых данных:

myDateTimeColumn.ValueType = GetType(DateTime)

Согласно MSDN свойство ValueType «используется при фильтрации или сортировке столбцов по содержанию их ячеек». Поэтому я обязательно установлю его для любого столбца, который позволяет сортировку.

С этим установленным свойством сетка может быть отсортирована по столбцу с нулевыми значениями, что приведет к преобразованию вставленных / обновленных ячеек в DateTime.

1 голос
/ 16 мая 2009

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

Если это нехорошо - как насчет создания собственного DataGridView, точно такого же, как встроенный (с использованием наследования) НО , переопределяющего метод сортировки для игнорирования нулей?

0 голосов
/ 21 сентября 2010

Просто чтобы добавить код к этому вопросу ... Я сделал следующее, чтобы сортировка работала корректно для DateTime (и других нестроковых типов) при наличии нулей:

public MyFormCTor() {
    ...
    m_dataGridView.SortCompare += MySortCompare;
    ...
}

...

static void MySortCompare(object sender, DataGridViewSortCompareEventArgs e)
{
    if (e.CellValue1 == e.CellValue2)
    {
        e.SortResult = 0;
        return;
    }

    if (e.CellValue1 == null)
    {
        e.SortResult = -1;
        return;
    }

    if (e.CellValue2 == null)
    {
        e.SortResult = 1;
        return;
    }

    e.SortResult = ((IComparable)e.CellValue1).CompareTo(e.CellValue2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...