在 RadGridView 中对货币列 VB.NET 进行排序

Sorting Currency Column VB.NET in RadGridView

我正在尝试使用自定义排序对 radgridview 中的货币列进行排序。

我能找到的唯一相关问题是这个: 但它没有提供解决方案。

我尝试使用我在下面实现的 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

当我排序时,它为我提供了以下结果:

但是它不允许我降序排序。

任何帮助将不胜感激,谢谢!

使用下面建议的答案 - 我已经实现了点击事件。

解决方案

假设您的单元格实际包含 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 returns 空 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

然后您可以在每个排序上切换它,例如在调用 Sort 方法之前的 Button.Click 事件处理程序中:

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))