C# 排序时排除ListView组
我有一个名为“mainListView”的列表视图(WinForms),其中显示了当前路径的文件和文件夹。根据每个文件的扩展名,我将它们分为不同的组。我还有一些列,当用户单击它们时,它们会对mainListView进行排序 最近,我添加了一个行为可能与其他组稍有不同的组,因此当用户在试图对列表中的项目进行排序的列中单击时,问题就出现了,新组将成为一个灾难,并且出现混乱。这个组中有一些元素在某些列中没有信息,所以如果按这些列排序,就会出现这种无序现象,这是正常的,所以我只想排除这个组进行排序 我想知道是否有某种方法可以排除此组,以便在单击列时进行排序。或者,如果与单击的列无关,我可以为该组应用不同的排序标准。我一直在尝试很多事情,寻找答案,我认为这是不可能的,但我不会不问就放弃 我目前的分拣代码: 在DisplayProperties中,我存储了一些用户配置,以便在再次加载程序时记住。所以基本上: DisplayProperties.mainListViewColumnSortAsc包含排序顺序:升序或降序。 DisplayProperties.MainListViewColumnSaved[]包含字符串列表,其中包含mainListView中每列的标识C# 排序时排除ListView组,c#,winforms,sorting,listview,C#,Winforms,Sorting,Listview,我有一个名为“mainListView”的列表视图(WinForms),其中显示了当前路径的文件和文件夹。根据每个文件的扩展名,我将它们分为不同的组。我还有一些列,当用户单击它们时,它们会对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列表视图。这是一个复杂的解释,但基本上我所寻找的是某种方式排序,而不影响一组特定的文件。