2014-01-15 38 views
0

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

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

我想知道是否有某种方式排除这个组被点击列时被排序。或者,如果独立于哪个列被点击,我可以为这个组应用不同的排序标准。我一直在尝试很多东西并寻找答案,我认为这是不可能的,但我不会放弃,至少不会。

我目前的排序代码: 在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(); 
} 
+0

这是winforms/wpf/webforms?我们将需要更多信息。 – Joe

+0

对不起。这是使用winforms ListView。有些复杂的解释,但基本上我正在寻找的是一种排序方式,而不影响特定的一组文件。 – marine05

回答

0

我找到了解决我的问题的方法。它比我想象的更简单。 我只是在IComparer类中添加了一些用于排序ListView的限制。 基本上我不会做任何事情,如果比较的对象是名为“多”的项目组中,这是我不希望通过点击列进行排序时影响的项目组。

我让你给我一段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); 
      } 
     }