如何将文件夹保存在listview中的文件上方 [英] How do I keep folders above files in listview

查看:78
本文介绍了如何将文件夹保存在listview中的文件上方的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个文件夹/文件ListView填充



1st [..](上一个文件夹,总是第一个)

2nd [目录1]

3 [目录2]

第4等...

5 [文件1]

6th [File 2]

7th etc ...



我想让文件夹始终保持在文件上方,即使你对列进行排序。一切正常,我打开组,但我想避免(或让它们看不见但我找不到任何解决方案)。应将文件夹与其他文件夹和文件进行排序。有没有办法在不使用替代ListView控件或分组的情况下执行此操作?



我尝试过:



I have a Folder/File ListView populated

1st [..] (Up one folder, always first)
2nd [Directory 1]
3rd [Directory 2]
4th etc...
5th [File 1]
6th [File 2]
7th etc...

I would like to keep the folders always above the files at all time even if you sort the columns. It all works fine is I turn on groups but I would like to avoid that(or make them invisible but I couldn't find any solution for that). The folders should be sorted compared to other folders and files to files. Is there a way to do this without using alternative ListView control or grouping?

What I have tried:

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;
            }
        }
    }

推荐答案

添加一列只是为了排序;例如0文件夹; 1文件。



然后隐藏排序列;或者,如果显示有用,则使用序列号。
Add a column just for sorting; e.g. "0" folder; "1" file.

Then "Hide" the "sorting" column; or, use a "sequence number" if display is useful.


这篇关于如何将文件夹保存在listview中的文件上方的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆