Как сохранить папки над файлами в listview
У меня есть заполненный список папок/файлов
1-й [..] (вверх по одной папке, всегда первый)
2-й [каталог 1]
3-й [каталог 2]
4-й и т. д...
5-й [файл 1]
6-й [файл 2]
7-й и т. д...
Я хотел бы всегда держать папки над файлами, даже если вы сортируете столбцы. Все это прекрасно работает, если я включаю группы, но я хотел бы избежать этого(или сделать их невидимыми, но я не мог найти никакого решения для этого). Папки должны быть отсортированы по сравнению с другими папками и файлами к файлам. Есть ли способ сделать это без использования альтернативного элемента управления ListView или группировки?
Что я уже пробовал:
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; } } }