【问题标题】:Exclude a ListView Group when sorting排序时排除 ListView 组
【发布时间】:2014-02-04 01:31:15
【问题描述】:

我有一个名为“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();
}

【问题讨论】:

  • 这是winforms / wpf / webforms吗?我们需要更多信息。
  • 对不起。这是使用winforms ListView。解释起来很复杂,但基本上我正在寻找的是一种在不影响特定文件组的情况下进行排序的方法。

标签: c# winforms sorting listview


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 2015-02-27
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    相关资源
    最近更新 更多