2011-07-28 151 views
0

我在XtraGrid中有一列顯示自插入記錄以來的時間。我在服務器上計算這個值,並以字符串形式返回時間。按時間排序正確排序

的問題是,它不是正確排序,請參閱圖像9天如何更多的則是23天...

Sort Problem

任何想法如何使它的方式排序會更好地工作?

+2

您CustomDisplayText事件在單元格的值只是文字?數據綁定了嗎?看起來它按字母順序排序給我。如果支持值是一個真正的DateTime,它將使用它來排序。 –

+0

這些值最初是字符串還是可能TimeSpans? –

+0

目前我計算在服務器上,在網格中傳遞一個長字符串。 – Ezi

回答

2

解決此問題的一種方法是將數據庫中的值作爲int64存儲爲Ticks,因此您可以在服務器端進行排序,然後在應用程序端從Ticks創建TimeSpans,然後您可以處理CustomColumnDisplayText可以根據需要顯示它,確保將列設置爲按值排序而不是DisplayText。

在你的GridView的地方

TimeSpan span = TimeSpan.FromTicks(e.Value); 
e.DisplayText = string.Format("{0} days {1} hours {2} minutes", span.Days, span.Hours, span.Minutes); 
+0

我不明白我怎麼能在網格「1天5小時」中顯示下劃線數據是日期 – Ezi

+0

您是否得到這個排序的Ezi?這個想法是你的基礎數據將是一個Int64(Long)。然後在CustomColumnDisplayText中,從eventargs e.Value獲取該數字,將其插入TimeSpan中,然後通過設置e.DisplayText值使其顯示「1 Day 5 Hour」。希望一切順利。 – AussieALF

+0

沒有...它仍然沒有工作。你可以給我一些樣本代碼,我如何轉換一個長的值來顯示「1天5小時」?謝謝 – Ezi

0

您可以將它作爲SQL語句的一部分在服務器上進行排序(我假設您從數據庫中獲取該數據)。你的另一種選擇是編寫你自己的比較函數,這個函數會涉及到將時間解析回某種時間範圍並對其進行排序。

+0

在服務器上排序不是一種選擇,因爲用戶需要有能力更改排序。 – Ezi

+0

啊,那麼你在編寫一個解析函數來解析文本到一個時間跨度。或者,您可以將實際時間跨度傳回並將其用作隱藏列。你必須使用一些技巧來讓排序使用你的隱藏列。 –

+0

時間跨度如何? – Ezi