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