2012-07-18 91 views
0

我想排序列表视图,然后删除多余的项目。但是这两个项目都没有正确排序,也没有完全删除冗余。请帮助..Listview不正确排序在c#

lvwMessages.Sorting = SortOrder.Descending; 

for (int i = 0; i < lvwMessages.Items.Count - 1; i++) 
{ 
    if (lvwMessages.Items[i].Tag == lvwMessages.Items[i + 1].Tag) 
     lvwMessages.Items[i + 1].Remove();  
} 

Listview at runtime with unsorted and redundant items

+0

看看这篇文章,看看它是否有帮助,http://support.microsoft.com/kb/319401。 – 2012-07-18 09:33:53

回答

2

您正在改变集合作为你迭代它。这总是有一些有趣的副作用。

E.G.比方说,你有分别的id和标签,五个项目,

ID0 - Tag1 
ID1 - Tag1 
ID2 - Tag1 
ID3 - Tag2 
ID4 - Tag2. 

第一次循环时,i = 0,和项目集合有5个元素。 将ID0与ID1进行比较,并删除ID1。

下一次通过循环,i = 1,Items集合有4个元素。 现在,而不是比较ID0与ID2,ID2与ID3相比,并没有被删除,等等

你可以使用这样的事情:

int i = 0; 
while (i < lvwMessages.Items.Count - 1) 
{ 
    if (lvwMessages.Items[i].Tag == lvwMessages.Items[i + 1].Tag) 
     lvwMessages.Items[i + 1].Remove();  
    else 
     i++; 
} 

增加计数器只有当你有没有删除一个项目。

+0

您应该使用@ lazyberezovsky有关排序的解决方案,然后使用代码进行排序。 – SWeko 2012-07-18 11:06:14

0

属性Sorting根据项目文本对项目进行排序。如果您想根据Tag对ListView中的项目进行排序,则应使用Sort方法。 Sort方法使用ListViewItemSorter属性中指定的IComparer对ListView中的项目执行手动排序。

这里是分拣机的一个例子:

public class ListViewItemComparer : IComparer 
{ 
    public int Compare(object x, object y) 
    { 
     YourType a = (YourType)((ListViewItem)x).Tag; 
     YourType b = (YourType)((ListViewItem)y).Tag; 
     // compare tags 
     return a.CompareTo(b); 
    } 
} 

用法:

listView.ListViewItemSorter = new ListViewItemComparer(); 

如果您想通过-1改变排序方向,乘法结果或使用b.Compare(a)