C# 排序时排除ListView组

C# 排序时排除ListView组,c#,winforms,sorting,listview,C#,Winforms,Sorting,Listview,我有一个名为“mainListView”的列表视图(WinForms),其中显示了当前路径的文件和文件夹。根据每个文件的扩展名,我将它们分为不同的组。我还有一些列,当用户单击它们时,它们会对mainListView进行排序 最近,我添加了一个行为可能与其他组稍有不同的组,因此当用户在试图对列表中的项目进行排序的列中单击时,问题就出现了,新组将成为一个灾难,并且出现混乱。这个组中有一些元素在某些列中没有信息,所以如果按这些列排序,就会出现这种无序现象,这是正常的,所以我只想排除这个组进行排序 我想

我有一个名为“mainListView”的列表视图(WinForms),其中显示了当前路径的文件和文件夹。根据每个文件的扩展名,我将它们分为不同的组。我还有一些列,当用户单击它们时,它们会对mainListView进行排序

最近,我添加了一个行为可能与其他组稍有不同的组,因此当用户在试图对列表中的项目进行排序的列中单击时,问题就出现了,新组将成为一个灾难,并且出现混乱。这个组中有一些元素在某些列中没有信息,所以如果按这些列排序,就会出现这种无序现象,这是正常的,所以我只想排除这个组进行排序

我想知道是否有某种方法可以排除此组,以便在单击列时进行排序。或者,如果与单击的列无关,我可以为该组应用不同的排序标准。我一直在尝试很多事情,寻找答案,我认为这是不可能的,但我不会不问就放弃

我目前的分拣代码: 在DisplayProperties中,我存储了一些用户配置,以便在再次加载程序时记住。所以基本上:

DisplayProperties.mainListViewColumnSortAsc包含排序顺序:升序或降序。 DisplayProperties.MainListViewColumnSaved[]包含字符串列表,其中包含mainListView中每列的标识

private void mainListView_ColumnClick(object sender, ColumnClickEventArgs e)
{
    if (DisplayProperties.mainListViewColumnsSaved[e.Column] == DisplayProperties.mainListViewColumnSort)
    {
        if (DisplayProperties.mainListViewColumnSortAsc == SortOrder.Ascending)
            DisplayProperties.mainListViewColumnSortAsc = SortOrder.Descending;
        if (DisplayProperties.mainListViewColumnSortAsc == SortOrder.Descending)
            DisplayProperties.mainListViewColumnSortAsc = SortOrder.Ascending;
    }
    else DisplayProperties.mainListViewColumnSort = DisplayProperties.mainListViewColumnsSaved[e.Column];

    mainListView.ListViewItemSorter = Sorter;

    if (!(mainListView.ListViewItemSorter is ListViewSorter))
        return;

    Sorter = (ListViewSorter)mainListView.ListViewItemSorter;

    if (Sorter.LastSort == e.Column)
    {
        if (mainListView.Sorting == SortOrder.Ascending)
            mainListView.Sorting = SortOrder.Descending;
        else
            mainListView.Sorting = SortOrder.Ascending;
    }
    else
        mainListView.Sorting = DisplayProperties.mainListViewColumnSortAsc;

    Sorter.ByColumn = e.Column;
    DisplayProperties.mainListViewColumnSortAsc = mainListView.Sorting;
    DisplayProperties.mainListViewColumnSort = DisplayProperties.mainListViewColumnsSaved[e.Column];
    mainListView.Sort();
}

我找到了解决我问题的办法。这比我想象的要简单。 我只是在IComparer类中添加了一些限制来对我的ListView进行排序。 基本上,如果要比较的对象位于名为“Multi”的项目组中,我什么也不做,这是我在列中单击排序时不想影响的项目组

我在这里为IComparer提供我的一段代码,以防它对有类似问题的人有用

public class ListViewSorter : IComparer
        {
            public int ByColumn { get; set; }

            public int LastSort { get; set; }

            public int Compare(object o1, object o2)
            {
                if (!(o1 is ListViewItem) || o1 is ListViewGroup)
                    return (0);
                if (!(o2 is ListViewItem) || o2 is ListViewGroup)
                    return (0);

                var itm = (ListViewItem)o1;
                if (itm.Group.Header.Contains("Multi"))
                    return (0);

                itm = (ListViewItem)o2;
                if (itm.Group.Header.Contains("Multi"))
                    return (0);

                var lvi1 = (ListViewItem)o2;
                string str1 = "";
                if (lvi1.SubItems.Count > ByColumn)
                    str1 = lvi1.SubItems[ByColumn].Text;

                var lvi2 = (ListViewItem)o1;
                string str2 = "";
                if (lvi2.SubItems.Count > ByColumn)
                    str2 = lvi2.SubItems[ByColumn].Text;

                int result;

                string a, b;
                if (lvi1.ListView.Sorting == SortOrder.Ascending)
                {
                    a = str1;
                    b = str2;
                }
                else
                {
                    a = str2;
                    b = str1;
                }

                DateTime dateTimeA;
                DateTime dateTimeB;
                double doubleA;
                double doubleB;
                if (DateTime.TryParse(a, out dateTimeA)
                  && DateTime.TryParse(b, out dateTimeB))
                {
                    result = DateTime.Compare(dateTimeA, dateTimeB);
                }
                else
                {
                    if (double.TryParse(a, out doubleA)
                      && double.TryParse(b, out doubleB))
                    {
                        result = doubleA.CompareTo(doubleB);
                    }
                    else
                    {
                        result = String.Compare(a, b);
                    }
                }

                LastSort = ByColumn;

                return (result);
            }
        }

这是winforms/wpf/webforms吗?我们需要更多的信息,对不起。这是使用winforms列表视图。这是一个复杂的解释,但基本上我所寻找的是某种方式排序,而不影响一组特定的文件。