簡體   English   中英

對vb.net的數據集中的所有數據表進行排序

[英]Sort all DataTable in Dataset for vb.net

我需要對mt Dataset所有DataTables進行Sort 我嘗試使用DefaultView ,它正在對我的數據表進行排序,但是在循環之后,該數據表看起來沒有排序就一樣。

這是我嘗試的:

 For Each Dt As DataTable In AlbumListDs.Tables
   Dt.DefaultView.Sort = "ImageData Asc"
   Dt = DataTable.DefaultView.ToTable
   Dt.AcceptChanges()
   AlbumListDs.AcceptChanges()
 Next

如果我做錯了什么,請糾正我。

在循環內對DataTable所做的更改是For Each的Iterator返回的元素的本地更改。

MSDN說

修改集合元素 枚舉器對象的Current屬性為ReadOnly(Visual Basic),它返回每個collection元素的本地副本。 這意味着您無法在For Each ... Next循環中修改元素本身。 您所做的任何修改只會影響Current中的本地副本,而不會反映回基礎集合中。

因此,當您使用以下命令重新創建DataTable時

Dt = DataTable.DefaultView.ToTable

新的Dt實例與DataSet中包含的實例不同。 因此,當您遍歷另一個DataTable元素時,更改會同時丟失。
這與您在C#中可以做的事情形成鮮明對比,在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

請注意,您需要從集合中刪除上一個表(表為只讀),然后添加新表。 如果您從集合的末尾向后循環到第一個元素,這樣會更安全,以避免可能的索引錯誤

我能夠以其他方式實現它。 它可能不是最佳解決方案,但可以滿足我的需要。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM