今天我在工作中被问及是否有可能对
DataTable通过列索引,因此在浏览DataTable方法列表时,我惊讶地发现除了简单的DataTable.Select方法之外,什么都没有。幸运的是,在.Net中,我们可以继承类,因此实现自定义排序功能并不困难。 这是我的操作方式:
Public Class SortableDataTable
Inherits DataTable
Public Sub Sort(ByVal columnIndex As Integer, _
ByVal direction As dDir)
Dim result As New List(Of DataRow)
Select Case direction
Case dDir.Ascending
Dim v = From r In Me.Rows _
Order By r(columnIndex) _
Ascending
For Each row In v
Dim nr As DataRow = Me.NewRow
nr.ItemArray = row.ItemArray.Clone
result.Add(nr)
Next
Case dDir.Descending
Dim v = From r In Me.Rows _
Order By r(columnIndex) _
Descending
For Each row In v
Dim nr As DataRow = Me.NewRow
nr.ItemArray = row.ItemArray.Clone
result.Add(nr)
Next
End Select
Me.Rows.Clear()
For Each row In result
Me.Rows.Add(row)
Next
End Sub
Public Sub New(ByVal source As DataTable)
If Me.Columns.Count <> source.Columns.Count Then
For Each c As DataColumn In source.Columns
Me.Columns.Add(c.Caption)
Next
End If
For Each r As DataRow In source.Rows
Dim nr As DataRow = Me.NewRow()
nr.ItemArray = r.ItemArray.Clone
Me.Rows.Add(nr)
Next
End Sub
End Class
Public Enum dDir
Ascending = 0
Descending = 1
End Enum
将此类添加到项目中后,我可以创建SortableDataTable ,如果我希望将此功能应用于已存在的表,则只需使用“ New ”构造函数,然后将要排序的表传递给我...
Public Sub Button1_Click(sender as object, e as EventArgs)
Dim newTable As New SortableDataTable(oldTable)
newTable.Sort(0, dDir.Ascending);
End Sub
不幸的是,这种处理方式意味着您不能将DataTable 强制转换为OrderedDataTable ,但是可以相反。
这意味着,例如,如果您希望在DataGridView上显示排序的数据,则DataSource属性还将接受这种类型的类。
最后一点,我必须承认,可能有更简单的方法来实现这种类型的排序,但是拥有这样的继承类将提供高级排序的可能性。
感谢您的阅读,希望对像我这样的同事有所帮助的人有所帮助:)
From: https://bytes.com/topic/visual-basic-net/insights/890896-how-add-sortable-functionallity-datatable