排序时排除ListView组

时间:2014-01-15 14:19:18

标签: c# winforms sorting listview

我有一个名为“mainListView”的ListView(WinForms),其中显示当前路径的文件和文件夹。根据每个文件的扩展名,我将它们放在不同的组中。我也有列在用户点击它们时对mainListView进行排序。

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

我想知道是否有某种方法可以排除此组,以便在单击列时进行排序。或者,如果单独单击哪个列,我可以为该组应用不同的排序条件。我一直在尝试很多事情并寻找答案,我认为这是不可能的,但我不会毫不犹豫地放弃。

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

DisplayProperties.mainListViewColumnSortAsc 包含排序顺序:升序或降序。 DisplayProperties.mainListViewColumnsSaved [] 包含一个字符串列表,其中包含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();
}

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。它比我更简单。 我刚刚在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);
            }
        }