Nagy_I_86 Ответов: 1

Как сохранить папки над файлами в 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;
            }
        }
    }

1 Ответов

Рейтинг:
9

Gerry Schmitz

Добавьте столбец только для сортировки; например, папка "0"; файл "1".

Затем "скройте" столбец "сортировка" или используйте "порядковый номер", если отображение полезно.


Nagy_I_86

Если я использую 0/1 и сортирую по убыванию, то файлы снова будут выше каталогов или я ошибаюсь? Кроме того сортировка 0/1 не будет сортировать его по алфавиту просто отдельные файлы и папки

Gerry Schmitz

Вы можете сортировать по нескольким столбцам.

Столбцы могут быть отсортированы по возрастанию или убыванию; независимо.

Вы можете иметь "условную" сортировку.

Что-нибудь еще, что я упускаю?

Nagy_I_86

Я думаю, что ваш подход будет правильным, но я не могу понять, как его реализовать. Он работает для столбца "имя", но не работает для других,таких как "расширение" со значениями ".EXE",". TXT"и т. д. или "последний доступ" с датами.