我想寫一個方法來過濾列表視圖IEnumerable的到的ListView
IEnumerable<ListViewItem> CurrentList;
CurrentList = ListViewExemple.Items.Cast<ListViewItem>();
var result = CurrentList.Select(i => i.Text.Contains(SearchTxtBox.Text));
現在,我該如何添加「結果」項的列表視圖清除
我想寫一個方法來過濾列表視圖IEnumerable的到的ListView
IEnumerable<ListViewItem> CurrentList;
CurrentList = ListViewExemple.Items.Cast<ListViewItem>();
var result = CurrentList.Select(i => i.Text.Contains(SearchTxtBox.Text));
現在,我該如何添加「結果」項的列表視圖清除
不幸的是,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))
你必須記住,一個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());
首先你應該用'Where()'改變'Select()'。你不能直接使用(比方說)'anotherListView.Items.AddRange(result.ToArray())',因爲你不能將相同的'ListViewItem'添加到兩個列表中。您可以克隆它們(文本,子項目和外觀),或者 - 更好 - 不要搜索「ListViewItem」,而要搜索它的_data source_(您用來構造第一個列表的普通C#對象)。每次使用(過濾)原始數據進行過濾時,重建您的列表。 – 2014-10-08 11:56:40