2012-07-18 98 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)