2014-03-07 13 views
2

我有一個包含Client對象的列表。我想作爲排序依據使用它的屬性名升序或降序,名單我已經在視圖狀態代碼:ViewState("PropertyName")ViewState("Order")VB.Net使用屬性名稱排序列表

Dim objList As List(Of Client) = Session("ClientList") 
objList.Sort(ViewState("PropertyName") + " " + ViewState("Order"))  
datarepeater.datasource = objList 

我怎樣才能做到這一點?

+0

您是否真的需要將屬性名稱存儲在ViewState中?然後,我會使用一個'DataTable'來代替它,您可以使用列名和LINQ來對它進行排序。 –

+0

如果我走這條路線,那麼我必須將我的列表轉換成我想避免的數據表。 – user3129969

回答

4

通常情況下,如果你知道與你想排序的屬性,您將能夠只是做這樣的事情:

clients.Sort(Function(x, y) x.Name.CompareTo(y.Name)) 

在上面的例子中,我當然選上Name財產(我不知道Client這個類有什麼屬性,我只是用它作爲例子)

但是,由於你不知道你要在運行時使用哪個屬性,你需要做更復雜的事情,如果你真的想使用這個類的實際屬性名稱,你可以使用反思動態檢索屬性的值,例如:

clients.Sort(Function(x, y) 
       Dim xProperty As PropertyInfo = x.GetType().GetProperty(ViewState("PropertyName").ToString) 
       Dim yProperty As PropertyInfo = y.GetType().GetProperty(ViewState("PropertyName").ToString) 
       Dim xValue As Object = xProperty.GetValue(x) 
       Dim yValue As Object = yProperty.GetValue(y) 
       Return xValue.ToString().CompareTo(yValue.ToString()) 
      End Function) 

要反轉排序順序,只是-1乘返回值,或切換哪個對象你比較一下。例如:

If ViewState("Order") = "Ascending" Then 
    Return xValue.ToString().CompareTo(yValue.ToString()) 
Else 
    Return yValue.ToString().CompareTo(xValue.ToString()) 
End If 
+0

謝謝史蒂文但是我得到一個選項嚴格禁止從對象轉換爲字符串在ViewState(「PropertyName」)。所以我添加了一個ToString。之後,我得到錯誤消息「重載解析失敗,因爲沒有可訪問的」GetValue「接受這個數量的參數。我沒有添加任何參數。這裏是我有: objList.Sort(Function(x,y)Dim xValue As String = x.GetType()。GetProperty(ViewState(「PropertyName」)。ToString).GetValue(x).ToString()Dim yValue As String = y.GetType()。GetProperty(ViewState(「PropertyName」)。ToString) .GetValue(y).ToString()返回xValue.CompareTo(yValue)結束函數) – user3129969

+0

在這個網站上,是否可以發佈而不是「添加評論」,這將使我的郵件更容易閱讀 – user3129969

+0

不幸的是,發佈格式正確的代碼的唯一方法就是編輯你的原始問題以包含新的代碼我認爲你得到這個錯誤的原因是因爲你的目標是舊版本的框架,只有一個參數的重載wasn直到.NET Framework 4.5版才加入,在這種情況下,只需添加'Nothing'作爲第二個參數,例如:'xProperty.GetValue(x,Nothing)'。 –

0

你也可以使用LINQ(使用由史蒂芬Doggart提出相同的通用方法):

sorted = lst.OrderBy(Function(x) x.GetType().GetProperty(_strColumnName01).GetValue(x)). _ 
      ThenBy(Function(x) x.GetType().GetProperty(_strColumnName02).GetValue(x)).ToList() 

在我具體的例子,我需要兩列進行排序,但對於剛單列:

sorted = lst.OrderBy(Function(x) x.GetType().GetProperty(_strColumnName01).GetValue(x)).ToList()