我正在尝试按包含 DBNull 值的列对 DataGridView 控件进行排序。此 DataGridView 控件绑定到 SQL Server 2012 数据库。
当我单击标题单元格(按升序排序)时,DBNull 值排在其余整数值之前,因此列中的顶部行都是空白的,然后是整数值 1,2, 3等按升序排列。
我该如何解决这个问题?我宁愿 DataGridView 控件对具有顶部值的行进行排序,然后是 DBNulls。
我试图在空白单元格中插入一个更高的值,然后对它们进行正确排序,但是当我将这些值返回给 System.DBNull.value 时,排序顺序会恢复到上面的方式。
我的代码如下:
If dgv.Columns(e.ColumnIndex).Name.EndsWith("Position") Then
intSortingRunningPosition = 1000
dgv.Sort(baseColumn, System.ComponentModel.ListSortDirection.Ascending)
newColumn.HeaderCell.SortGlyphDirection = Windows.Forms.SortOrder.Ascending
For Each dr As DataGridViewRow In dgv.Rows
If dr.Cells(e.ColumnIndex).Value Is System.DBNull.Value Then
dr.Cells(e.ColumnIndex).Value = intSortingRunningPosition
intSortingRunningPosition += 1
End If
Next
dgv.Sort(newColumn, System.ComponentModel.ListSortDirection.Ascending)
For Each dr As DataGridViewRow In dgv.Rows
If dr.Cells(e.ColumnIndex).Value >= 1000 Then
dr.Cells(e.ColumnIndex).Value = System.DBNull.Value
End If
Next
End If
对不起,如果这令人困惑。谢谢!
更新:
我已经修改了我的代码以使用 IComparer 方法,并提出了以下内容:
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
Implements System.Collections.IComparer.Compare
Dim DataGridViewRow1 As DataGridViewRow = CType(x, DataGridViewRow)
Dim DataGridViewRow2 As DataGridViewRow = CType(y, DataGridViewRow)
Dim CompareResult As Integer
Dim intDGV1Cell0Value As Integer = Nothing
Dim intDGV1Cell1Value As Integer = Nothing
Dim intDGV2Cell0Value As Integer = Nothing
Dim intDGV2Cell1Value As Integer = Nothing
Try
intDGV1Cell0Value = CInt(DataGridViewRow1.Cells(0).Value)
Catch ex As Exception
intDGV1Cell0Value = Int32.MaxValue
End Try
Try
intDGV1Cell1Value = CInt(DataGridViewRow1.Cells(1).Value)
Catch ex As Exception
intDGV1Cell1Value = Int32.MaxValue
End Try
Try
intDGV2Cell0Value = CInt(DataGridViewRow2.Cells(0).Value)
Catch ex As Exception
intDGV2Cell0Value = Int32.MaxValue
End Try
Try
intDGV2Cell1Value = CInt(DataGridViewRow2.Cells(1).Value)
Catch ex As Exception
intDGV2Cell1Value = Int32.MaxValue
End Try
' Try to sort based on the Last Name column.
CompareResult = System.String.Compare(intDGV1Cell1Value, intDGV2Cell1Value)
' If the Last Names are equal, sort based on the First Name.
If CompareResult = 0 Then
CompareResult = System.String.Compare(intDGV1Cell0Value, intDGV2Cell0Value)
End If
Return CompareResult * sortOrderModifier
End Function
空值现在根本不排序。关于我在这里做错了什么的任何想法?我敢肯定我有点不在场,因为它是......