2011-04-07 54 views
3

我使用這個排序列表視圖:http://support.microsoft.com/kb/319401 它的工作很好,除了當我嘗試整理日期列,它的東西2AM談到晚上10點後(因爲2大於1)。按日期時間值排序列不是字符串值?

4/7/2011 10:00:00 PM 
4/7/2011 2:00:00 AM 

這是代碼我使用:

var lvcs = new ListViewColumnSorter(); 
ListView.ListViewItemSorter = lvcs; 
lvcs.Order = SortOrder.Ascending; 
lvcs.SortColumn = 1; //<-Contains DateTime values in string format 
ListView.Sort(); 

所以,我怎麼能轉換爲DateTime和排序使用上面的代碼?

回答

10

查找範圍this article「排序日期」部分 - 更換比較方法。

示例代碼:

try { 
    DateTime dateX = Convert.ToDateTime(listviewX.SubItems[ColumnToSort].Text); 
    DateTime dateY = Convert.ToDateTime(listviewY.SubItems[ColumnToSort].Text); 
    compareResult = ObjectCompare.Compare(dateX, dateY); 
} 
catch { 
    compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text); 
} 
0

你應該從你的列表視圖讓你的項目和轉換日期/時間字符串的DateTime對象,然後調用排序對這些對象(已經把他們集合中),然後把它們放回你的ListView。

希望可以解決您的問題。

+0

嗨,通過把他們「回[我]列表視圖」,將意味着該列表將被清除,補充? – sooprise 2011-04-07 14:58:20

+0

啊,還有你想將它們放回,排序順序明顯... – 2011-04-07 15:04:18

0

以上是正確的,因爲你正在做的名單的字符串比較。

嘗試轉換爲DateTime和創建List<DateTime>和排序它,然後,

您可以使用DateTime.TryParse或ParseExact指定你自己的解析格式

0

答案標記爲正確的位置並沒有幫助我。我的應用似乎陷入了無限循環的拋出異常。爲了避免使用一個try/catch和追趕拋出產生的異常,我用下面的,它完美的作品:

DateTime dateX; 
DateTime dateY; 
if (
    DateTime.TryParse(listviewX.SubItems[ColumnToSort].Text, out dateX) 
    && DateTime.TryParse(listviewY.SubItems[ColumnToSort].Text, out dateY) 
    ) 
{ 
    compareResult = ObjectCompare.Compare(dateX, dateY); 
} 
else 
{ 
    compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text); 
} 
+0

無限循環的出現是因爲異常是工藝精深。你的解決方案更好。另一種方式我所做的就是添加一個名爲SortType新的屬性,並在比較中,打開類型相應解析字符串。 – Dan 2013-07-05 20:00:07

相關問題