我需要Sort
mt DataTables
中Dataset
DefaultView
。我已经尝试使用 For Each Dt As DataTable In AlbumListDs.Tables
Dt.DefaultView.Sort = "ImageData Asc"
Dt = DataTable.DefaultView.ToTable
Dt.AcceptChanges()
AlbumListDs.AcceptChanges()
Next
,它正在对我的数据表进行排序,但是在循环之后,数据表看起来相同而没有排序。
这是我试过的:
{{1}}
如果我做错了,请纠正我。
答案 0 :(得分:1)
在循环内部对DataTable所做的更改对于For Each的Iterator返回的元素是本地的。
修改收藏元素。枚举器的Current属性 object是ReadOnly(Visual Basic),它返回每个的本地副本 集合元素。这意味着您无法修改元素 他们自己在For Each ... Next循环中。你做的任何修改 仅影响来自Current的本地副本,并且不会反射回来 进入基础集合。
因此,当您使用
重新创建DataTable时Dt = DataTable.DefaultView.ToTable
新的Dt实例与DataSet中包含的实例不同。因此,当您循环遍历另一个DataTable元素时,您的更改将丢失 这与您在C#中可以做的事情形成鲜明对比,其中更改迭代器实例的尝试会立即被编译器捕获并在编译时发出错误信号
也许您只需更改DefaultView排序表达式并将DataTable保持原始顺序(当然,它会更好地用于您的内存使用)。当您需要以有序方式循环时,只需使用DataView
For Each drv As DataRowView in DataTable.DefaultView
Console.WriteLine(drv("YourField").ToString())
Next
或使用法线进行...循环(向后方向)
For x as Integer = AlbumListDs.Tables.Count - 1 To 0 Step -1
Dim dt = AlbumListDs.Tables(x)
dt.DefaultView.Sort = "ImageData Asc"
AlbumListDs.Tables.RemoveAt(x)
AlbumListDs.Tables.Add(dt.DefaultView.ToTable)
Next
AlbumListDs.AcceptChanges
请注意,您需要从集合中删除上一个表(只读表),然后添加新表。如果从集合的末尾向后循环到第一个元素以避免可能的索引错误,则更安全
答案 1 :(得分:1)
我能够以不同的方式实现它。它可能不是最好的解决方案,但适用于我需要做的事情。
objReturnDS.Tables(1).DefaultView.Sort = "RowID asc"
objReturnDS.Tables(1).DefaultView.ToTable(True)
Dim sortedTable = objReturnDS.Tables(1).DefaultView.ToTable(True)
objReturnDS.Tables(1).Clear()
objReturnDS.Tables(1).Merge(sortedTable)