gpt4 book ai didi

vb.net - 对 DGV 列进行升序排序,同时将空值放在底部

转载 作者:行者123 更新时间:2023-12-04 02:04:52 24 4
gpt4 key购买 nike

我需要将列中的空值放在 DGV 列的底部。我需要它按升序排列,这会将空值放在第一位,但我不想先看到它,我想在我的最大值之后看到它们。这是我到目前为止所拥有的,但它将空值放在第一位,我不确定如何处理将空值放在最后的自定义排序。示例:

    dim display as integer = 0

dataGridView1.Columns("Weight").DisplayIndex = display
display += 1
dataGridView1.Columns("Height").DisplayIndex = display

dataGridView1.Sort(dataGridView1.Columns("Height"), System.ComponentModel.ListSortDirection.Ascending)

不要担心为什么我的高度有空值,我只是使用示例数据来解决这个问题。

最佳答案

字符串排序

可以通过为 DataGridView(MSDN's code 的改编版本)创建自定义行比较器来完成您的要求:

Public Class DataGridViewColumnComparer
Implements IComparer

Private SortOrderModifier As Integer = 1
Private ColumnName As String

Public Sub New(ByVal ColumnName As String, ByVal Order As SortOrder)
Me.ColumnName = ColumnName
If Order = SortOrder.Descending Then
SortOrderModifier = -1
ElseIf Order = SortOrder.Ascending Then
SortOrderModifier = 1
End If
End Sub

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Dim Row1 As DataGridViewRow = CType(x, DataGridViewRow)
Dim Row2 As DataGridViewRow = CType(y, DataGridViewRow)

Dim Row1Value As String = Row1.Cells(ColumnName).Value.ToString()
Dim Row2Value As String = Row2.Cells(ColumnName).Value.ToString()

'If CompareResult = 1 that means that Row1 should be placed BELOW Row2.
'If CompareResult = -1 that means that Row1 should be placed ABOVE Row2.
Dim CompareResult As Integer = String.Compare(Row1Value, Row2Value)

If String.IsNullOrEmpty(Row1Value) = True Then
CompareResult = 1 'Row1 has an empty/null value, place it below Row2.
ElseIf String.IsNullOrEmpty(Row2Value) = True Then
CompareResult = -1 'Row2 has an empty/null value, place Row1 above.
End If

Return CompareResult * SortOrderModifier
End Function
End Class

用法:

DataGridView1.Sort(New DataGridViewColumnComparer("Height", SortOrder.Ascending))

而且有效!

DataGridView sort example


数值排序

前面的例子展示了一个基于字符串的排序算法。它会根据字符集中最先出现的字符逐个字符地对每个单元格进行排序。

如果您想要按数字对行进行排序,则必须稍微调整一下代码:

Public Class DataGridViewNumericComparer
Implements IComparer

Private SortOrderModifier As Integer = 1
Private ColumnName As String

Public Sub New(ByVal ColumnName As String, ByVal Order As SortOrder)
Me.ColumnName = ColumnName
If Order = SortOrder.Descending Then
SortOrderModifier = -1
ElseIf Order = SortOrder.Ascending Then
SortOrderModifier = 1
End If
End Sub

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Dim Row1 As DataGridViewRow = CType(x, DataGridViewRow)
Dim Row2 As DataGridViewRow = CType(y, DataGridViewRow)

Dim Row1Value As String = Row1.Cells(ColumnName).Value.ToString()
Dim Row2Value As String = Row2.Cells(ColumnName).Value.ToString()

Dim Row1NumVal As Nullable(Of Long) = Nothing
Dim Row2NumVal As Nullable(Of Long) = Nothing

Dim Row1Temp As Long = 0
Dim Row2Temp As Long = 0

If Long.TryParse(Row1Value, Row1Temp) = True Then Row1NumVal = Row1Temp
If Long.TryParse(Row2Value, Row2Temp) = True Then Row2NumVal = Row2Temp

'If CompareResult = 1 that means that Row1 should be placed BELOW Row2.
'If CompareResult = -1 that means that Row1 should be placed ABOVE Row2.
Dim CompareResult As Integer

If Row1NumVal.HasValue = True AndAlso Row2NumVal.HasValue = True Then
CompareResult = Row1NumVal.Value.CompareTo(Row2NumVal.Value)

ElseIf Row1NumVal.HasValue = False Then
CompareResult = 1

ElseIf Row2NumVal.HasValue = False Then
CompareResult = -1

End If

Return CompareResult * SortOrderModifier
End Function
End Class

用法:

DataGridView1.Sort(New DataGridViewNumericComparer("Height", SortOrder.Ascending))

此版本将按数字顺序对所有数字进行排序,并将所有不是数字的内容放在底部。

关于vb.net - 对 DGV 列进行升序排序,同时将空值放在底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44271490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com