public class ListViewColumnSorter : IComparer { private int ColumnToSort; private string ColumnNameToSort = ""; private SortOrder OrderOfSort; private CaseInsensitiveComparer ObjectCompare; public ListViewColumnSorter() { ColumnToSort = 0; OrderOfSort = SortOrder.None; ObjectCompare = new CaseInsensitiveComparer(); } public int Compare(object x, object y) { int compareResult; ListViewItem listviewX, listviewY; listviewX = (ListViewItem)x; listviewY = (ListViewItem)y; string path = listviewX.Tag.ToString(); string path2 = listviewY.Tag.ToString(); switch (ColumnName) { case "Name": compareResult = String.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text); if (Order == SortOrder.Descending) compareResult *= -1; return compareResult; case "Extension": compareResult = String.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text); if (Order == SortOrder.Descending) // Invert the value returned by Compare. compareResult *= -1; return compareResult; case "Size": if (System.IO.File.Exists(path) & System.IO.File.Exists(path2)) { FileInfo fi = new FileInfo(path); FileInfo fi2 = new FileInfo(path2); compareResult = ObjectCompare.Compare(fi.Length, fi2.Length); } else { compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text); } break; case "Last accessed": { DateTime x1, y1; if (!DateTime.TryParse(listviewX.SubItems[ColumnToSort].Text, out x1)) x1 = DateTime.MinValue; if (!DateTime.TryParse(listviewY.SubItems[ColumnToSort].Text, out y1)) y1 = DateTime.MinValue; compareResult = DateTime.Compare(x1, y1); if (x1 != DateTime.MinValue && y1 != DateTime.MinValue) goto done; compareResult = String.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text); done: if (Order == SortOrder.Descending) compareResult *= -1; return compareResult; } default: compareResult = ObjectCompare.Compare(listviewX.SubItems[ColumnToSort].Text, listviewY.SubItems[ColumnToSort].Text); break; } if (OrderOfSort == SortOrder.Ascending) { return compareResult; } else if (OrderOfSort == SortOrder.Descending) { return (-compareResult); } else { return 0; } } public int SortColumn { set { ColumnToSort = value; } get { return ColumnToSort; } } public string ColumnName { set { ColumnNameToSort = value; } get { return ColumnNameToSort; } } public SortOrder Order { set { OrderOfSort = value; } get { return OrderOfSort; } } }
var
This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)