4

私の DataGridView のDataSourceDataViewにバインドされています。DataView は私のdtBills DataTableと同じです。そのようです:

Dim View As New DataView
View.Table = DataSet1.Tables("dtBills")
dgvBills.DataSource = View

この DataGridView には複数の列があります。特に、情報として文字列と整数を持っているものがあります。DataGridView 列ヘッダーをクリックして列を並べ替えると、左側の列のような文字列として並べ替えられます。

'Curr Col  >>>   ' Wanted Result
10001      >>>   10001
100012     >>>   11000
11000      >>>   12000
110049     >>>   100012
12000      >>>   110049
E-1234     >>>   E-1234
T-12345    >>>   T-1235
T-1235     >>>   T-12345

通常のように列ヘッダーを押すと、バインドされた DataGridView 列を並べ替えるにはどうすればよいですか? 私は私DataViewを助けるために私を使うべきですか?

4

2 に答える 2

1

列は文字列として正しくソートされており、数値としてソートしたいと思います。問題は、文字列が数字と文字を組み合わせているように見えることです。その結果、 a のかなり複雑なソートが必要になりDataViewます。

Dim tbl As New DataTable("dtBills")
Dim DataSet1 As New DataSet
DataSet1.Tables.Add(tbl)
tbl.Columns.Add(New DataColumn("MyCol", GetType(String)))
Dim vals As String() = {"10001", "100012", "11000", "110049", "12000", "E-1234", "T-12345", "T-1235"}
For qq = 0 To vals.Length - 1
    Dim row As DataRow
    row = tbl.NewRow
    row(0) = vals(qq)
    tbl.Rows.Add(vals(qq))
Next
tbl = DataSet1.Tables("dtBills")
tbl.Columns.Add(New DataColumn("Scol2", GetType(Integer)) With {.Expression = "Convert(iif (substring(MyCol,1,2) like '*-',substring(MyCol,3,len(MyCol)-1),MyCol), 'System.Int32')"})
tbl.Columns.Add(New DataColumn("Scol1", GetType(String)) With {.Expression = "iif (substring(MyCol,1,2) like '*-',substring(MyCol,1,2),'')"})
Dim View As New DataView(tbl)
View.Sort = "Scol1,Scol2"
View.Table = DataSet1.Tables("dtBills")

したがって、2 つの新しい列が追加されます。1 つ目は先頭文字による並べ替えを維持し、2 つ目は文字列に含まれる数値による並べ替えを有効にします。

于 2013-09-09T07:55:52.023 に答える
1

DataGridView がデータバインドされている場合、その並べ替えを使用することはできず、ソース データを並べ替える必要があります。並べ替えは少し複雑なので、2 つのヘルパー列が必要です。

dgvBills.AutoGenerateColumns = False
tbl.Columns.Add(New DataColumn("Scol1", GetType(String)))
tbl.Columns.Add(New DataColumn("Scol2", GetType(Integer)))

最初のものには、先頭の文字 (または空の文字列) が含まれます。2 番目には、文字列に含まれる数値のみが含まれます。でソートしScol1, Scol2ます。

ここで、すべての通信をProgramaticモードに設定します ( DataGridViewColumnSortMode Enumeration ) 。

For Each column As DataGridViewColumn In dgvBills.Columns
    column.SortMode = DataGridViewColumnSortMode.Programmatic
Next

ColumnHeaderMouseClickまた、カスタムの並べ替えは( DataGridView.Sort Method (IComparer) )のハンドラーで実現されます。グリッドの並べ替えの代わりに、基になるビューの並べ替えを使用します。

Private Sub dgvBills_ColumnHeaderMouseClick(sender As Object, e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgvBills.ColumnHeaderMouseClick
    Dim newColumn As DataGridViewColumn = dgvBills.Columns(e.ColumnIndex)

    Dim direction As ListSortDirection
    Dim Modifier As String = ""

    If newColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending Then
        direction = ListSortDirection.Descending
        Modifier = " desc"
    Else
        direction = ListSortDirection.Ascending
    End If

    Dim View As DataView = dgvBills.DataSource

    If {"JobNumber", "JobNumber1"}.Contains(dgvBills.Columns(e.ColumnIndex).Name) Then
        View.Table.Columns("Scol2").Expression = String.Format("Convert(iif (substring({0},1,2) like '*-',substring({0},3,len({0})-1),{0}), 'System.Int32')", dgvBills.Columns(e.ColumnIndex).Name)
        View.Table.Columns("Scol1").Expression = String.Format("iif (substring({0},1,2) like '*-',substring({0},1,2),'')", dgvBills.Columns(e.ColumnIndex).Name)
        View.Sort = String.Format("Scol1 {0},Scol2 {0}", Modifier)
    Else
        dgvBills.Sort(newColumn, direction)
    End If

    If direction = ListSortDirection.Ascending Then
        newColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending
    Else
        newColumn.HeaderCell.SortGlyphDirection = SortOrder.Descending
    End If

End Sub

異なる{"JobNumber", "JobNumber1"}.Contains ... 方法でソートされた列を設定することができます。他の列は、デフォルトでグリッドが並べ替えるように並べ替えられます。または、別のカスタム並べ替えを作成することもできます。

注:完全に機能する例がありますが、フラグメントで十分であることを願っています。

于 2013-09-10T08:47:46.577 に答える