2014-10-08 26 views
3

我想寫一個方法來過濾列表視圖IEnumerable的到的ListView

IEnumerable<ListViewItem> CurrentList; 
CurrentList = ListViewExemple.Items.Cast<ListViewItem>(); 
var result = CurrentList.Select(i => i.Text.Contains(SearchTxtBox.Text)); 

現在,我該如何添加「結果」項的列表視圖清除

+0

首先你應該用'Where()'改變'Select()'。你不能直接使用(比方說)'anotherListView.Items.AddRange(result.ToArray())',因爲你不能將相同的'ListViewItem'添加到兩個列表中。您可以克隆它們(文本,子項目和外觀),或者 - 更好 - 不要搜索「ListViewItem」,而要搜索它的_data source_(您用來構造第一個列表的普通C#對象)。每次使用(過濾)原始數據進行過濾時,重建您的列表。 – 2014-10-08 11:56:40

回答

0

不幸的是,ListView沒有數據綁定能力。所以,你需要手動添加的項目:

foreach (var item in result) 
    someListView.Items.Add(item); 

或者可能:

someListView.Items.AddRange(result); 

而且,你似乎在這裏有一個BUG:

CurrentList.Select(i => i.Text.Contains(SearchTxtBox.Text)) 

這不會產生一個ListViewItem s的集合,它將產生一個bool s的集合。我想你的意思是這樣的:

CurrentList.Where(i => i.Text.Contains(SearchTxtBox.Text)) 
2

你必須記住,一個ListViewItem的有所有者,你需要做的項目的副本將其放在另一個列表視圖。使用它的Clone()方法很容易。或者將它從一個移到另一個,在這種情況下不太可能。所以你可能想要這個:

var matches = listView1.Items.Cast<ListViewItem>() 
        .Select(item => (ListViewItem)item.Clone()) 
        .Where(item => item.Text.Contains(SearchTxtBox.Text)); 
    listView2.Items.Clear(); 
    listView2.Items.AddRange(matches.ToArray()); 
+0

不能很好地克隆對象 – MediSoft 2014-10-08 14:31:05

+0

不知道「對象」可能意味着什麼。它是一個ListViewItem,它克隆得很好。 – 2014-10-08 14:32:48

+0

正如Adriano Reppetti所說,我只是試圖在施工過程中克隆它,並且這是工作。感謝您的幫助。 – MediSoft 2014-10-08 14:39:38