Сортировка столбца валюты VB.NET в RadGridView

Я пытаюсь отсортировать столбец валюты в radgridview, используя пользовательскую сортировку.

Единственный другой вопрос, который я мог найти, был следующим: Сортировка валюты в VB.NET но это не решение.

Я попытался использовать пример Telerik https://docs.telerik.com/devtools/winforms/controls/gridview/sorting/custom-sorting, который я реализовал ниже.

Private Sub CustomSort(sender As Object, e As GridViewCustomSortingEventArgs)
    Dim row1 As Decimal
    Dim row2 As Decimal

    If e.Row1.Cells("Pickable").Value.ToString = "" Then
        row1 = 0
    Else
        row1 = Convert.ToDecimal(e.Row1.Cells("Pickable").Value.ToString.Substring(1))
    End If
    If e.Row2.Cells("Pickable").Value.ToString = "" Then
        row2 = 0
    Else
        row2 = Convert.ToDecimal(e.Row2.Cells("Pickable").Value.ToString.Substring(1))
    End If

    If row1 > row2 Then
        e.SortResult = 1
    ElseIf row1 < row2 Then
        e.SortResult = -1
    Else
        e.SortResult = 0
    End If
End Sub

Это дает мне следующий результат при сортировке:

Результаты

Но тогда это не позволит мне сортировать по убыванию.

Любая помощь будет оценена, спасибо!

Используя ответ, предложенный ниже, я реализовал событие Click. Событие клика

РЕШЕНИЕ solution


person Oliver    schedule 30.06.2020    source источник


Ответы (1)


Предполагая, что ваши ячейки действительно содержат Strings, попробуйте следующее:

Dim value1 As Decimal
Dim value2 As Decimal

Decimal.TryParse(CStr(e.Row1.Cells("Pickable").Value), NumberStyles.Currency, Nothing, value1)
Decimal.TryParse(CStr(e.Row2.Cells("Pickable").Value), NumberStyles.Currency, Nothing, value2)

e.SortResult = value1.CompareTo(value2)

Если пустые ячейки на самом деле NULL, а не пустые, вы можете воспользоваться тем фактом, что DBNull.ToString возвращает пустое String:

Decimal.TryParse(e.Row1.Cells("Pickable").Value.ToString(), NumberStyles.Currency, Nothing, value1)
Decimal.TryParse(e.Row2.Cells("Pickable").Value.ToString(), NumberStyles.Currency, Nothing, value2)

Что касается сортировки по убыванию, я не знаю, как этот элемент управления указывает направление сортировки, но, если вы выполняете пользовательскую сортировку, я предполагаю, что вы сами должны ее запомнить. В этом случае вы можете использовать поле для указания текущего направления:

Private isDescending As Boolean = True

Затем вы можете просто переключать это для каждого вида, например. в обработчике событий Button.Click перед вызовом метода Sort:

isDescending = Not isDescending

Затем вы можете установить результат сравнения на основе этого направления:

Dim value1 As Decimal
Dim value2 As Decimal

Decimal.TryParse(e.Row1.Cells("Pickable").Value.ToString(), NumberStyles.Currency, Nothing, value1)
Decimal.TryParse(e.Row2.Cells("Pickable").Value.ToString(), NumberStyles.Currency, Nothing, value2)

e.SortResult = If(isDescending, value2.CompareTo(value1), value1.CompareTo(value2))
person jmcilhinney    schedule 30.06.2020
comment
Привет, да, это строковый столбец. Он выдает «Преобразование из типа« DBNull »в тип« String »недопустимо». ошибка, как мне справиться с этим для нулевых значений в вашем примере? - person Oliver; 30.06.2020
comment
Я добавил .ToString(), и теперь он работает без ошибок, но все результаты зашифрованы, см. мой пост, я опубликую скриншот. - person Oliver; 30.06.2020
comment
А, я понимаю, почему это происходит. Я переключал направление, как если бы событие возникало один раз для каждой сортировки, но это не так. Он будет подниматься столько раз, сколько потребуется для выполнения достаточного количества сравнений для сортировки данных. Это означает, что вам нужно будет переключать поле isDirection один раз для каждой сортировки. Я не знаю точно, как вы это сделаете, потому что я не знаю, как вы инициируете сортировку. Если, например, вы щелкаете Button и вызываете метод Sort, вы должны переключить поле перед вызовом Sort. - person jmcilhinney; 30.06.2020
comment
Сортировка активируется с помощью одного щелчка мыши на заголовке столбца radgridview, я попытался реализовать событие щелчка в radgrid и опубликовал результаты в своем ответе. - person Oliver; 30.06.2020
comment
Используя ваш ответ в сочетании с телериком, я добился результата, который ищу. Спасибо за вашу помощь! - person Oliver; 30.06.2020