0

DBNull 値を含む列で DataGridView コントロールを並べ替えようとしています。この DataGridView コントロールは、SQL Server 2012 データベースにバインドされています。

ヘッダーセルをクリックすると (昇順で並べ替えるため)、DBNull 値が残りの整数値より前に並べ替えられるため、列の一番上の行はすべて空白になり、その後は整数値 1、2、 3等は昇順です。

どうすればこれを回避できますか? むしろ、DataGridView コントロールで行を並べ替え、値を一番上にして、その後に DBNull を並べ替えます。

空白のセルにより大きな値を挿入しようとしましたが、正しく並べ替えられましたが、それらの値を 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

null 値はまったくソートされなくなりました。ここで私が間違っていることについてのアイデアはありますか? 私は確かに球場から少し外れています...

4

2 に答える 2

0

このデータベースは外部データセットにバインドされていたため、Sort(ICompare) メソッドを使用してこのデータベースを並べ替えることができませんでした。接続文字列を変更して、データテーブルを補充することになりました。

私のコードは次のとおりです。

If DataType = "Integer" Then
    If Column = "Vehicle Number" Then
        strConnectionStringCase = "Select * From Timing ORDER BY CAST([Class] AS NVARCHAR(MAX)) " & Direction & ", CONVERT(int, RTRIM(CAST([" & Column & "] AS NVARCHAR(MAX)))) " & Direction
    End If        
ElseIf DataType = "DateTime" Then
    strConnectionStringCase = "Select * From Timing ORDER BY CASE WHEN [" & Column & "] is NULL THEN 1 ELSE 0 END, [" & Column & "] " & Direction
ElseIf DataType = "String" Then
    If Column = "Vehicle Number" Then
        strConnectionStringCase = "Select * From Timing ORDER BY LEN(CAST([" & Column & "] AS NVARCHAR(MAX))) " & Direction & ", CAST([Class] AS NVARCHAR(MAX)) " & Direction & ", CAST([" & Column & "] AS NVARCHAR(MAX)) " & Direction
    End If
End If

このサブルーチンは、ヘッダー セルのクリック イベントで呼び出します。列名、ソート方向、およびデータ型をこのサブルーチンに送信します。

このコードでは、データの種類に応じて列を並べ替えることもできます。英数字の文字列がある場合は、それらが整数のみであるかのように、同様の順序で並べ替えることができます。DBNull 値は、常に並べ替えの最後に配置されます。

助けてくれてありがとう!

于 2013-01-28T19:22:13.107 に答える
0

bitと呼ばれるデータセットにフィールドを追加することができます。NullValueこれ0は、NULL ではないデータ列のすべてのエントリと、1IS NULL のエントリです。

次に、並べ替え操作の一部として、データ列自体とこの追加のビット列の両方で並べ替え、並べ替えで null 以外の値の後に null が自然に表示されるようにします。

于 2013-01-08T15:59:09.663 に答える