gpt4 book ai didi

vb.net - 对字母数字数据 View 列进行排序

转载 作者:行者123 更新时间:2023-12-02 03:35:46 27 4
gpt4 key购买 nike

我的 DataGridView 的 DataSource 绑定(bind)到 DataView。 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

像平常一样按列标题时,如何对绑定(bind)的 DataGridView 列进行排序?我应该使用 DataView 来帮助我吗?

最佳答案

当 DataGridView 进行数据绑定(bind)时,无法使用其排序,并且需要对源数据进行排序。排序有点复杂,所以我需要两个辅助列。

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

第一个将包含前导字母(或空字符串)。第二个将仅包含字符串中包含的数字。我们将按 Scol1、Scol2 排序。

现在我们将所有社区设置为Programatic 模式 ( DataGridViewColumnSortMode Enumeration )

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

自定义排序是在 ColumnHeaderMouseClick ( DataGridView.Sort Method (IComparer) ) 的处理程序中实现的。我们将使用底层 View 的排序而不是网格排序。

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 ...中可以设置不同排序的列。其他列按照网格默认排序方式进行排序,或者可以创建其他自定义排序。

注意:我有完整的工作示例,但我希望片段足够好。

关于vb.net - 对字母数字数据 View 列进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18658768/

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