2012-06-08 3 views
0

Я хочу создать объект ListView.SelectedListViewItemCollection из ListViewItem. Вот мой подход:Как преобразовать ListViewItem в ListView.SelectedListViewItemCollection?

public ListView.SelectedListViewItemCollection getSelectedListViewItemCollection(ListViewItem myListViewItem) 
{ 
    ListView myListView = new ListView(); 
    ListViewItem listViewItem = (ListViewItem)myListViewItem.Clone(); 
    listViewItem.Selected = true; 
    myListView.Items.Add(listViewItem); 
    return new ListView.SelectedListViewItemCollection(myListView); 
} 

Однако пустой список возвращается. (Список должен был содержать данный listViewItem) Что не так с моим подходом?

+0

Не могли бы вы дать нам немного более общую картину? Что вы пытаетесь сделать с возвращаемым значением здесь? Я подозреваю, что есть лучший способ достичь того, что вы пытаетесь сделать. – Crisfole

+0

Вместо этого вы должны вернуть 'IEnumerable ''. – SLaks

+0

Никогда не пробовал, но я бы сказал, что проблема с Клоном. В качестве выбранных элементов должны быть те элементы, где выбрано значение true. –

ответ

0

SelectedListViewItemCollection - это всего лишь оболочка для ListView с ListViewItems, свойство Selected которых истинно. Но ListView должен быть виден, чтобы он работал правильно.

Если вы хотите создать коллекцию элементов ListView, которые не выбраны на экране, вам не следует использовать SelectedListViewItemCollection.

+0

ОК спасибо, я снова заново рассмотрю свой подход – David

0

Я не уверен, почему вы хотели бы получить список (или коллекцию), что такое ListView.SelectedListViewItemCollection, из ListViewItem, который является единственным элементом в элементе управления ListView? Похоже, вы хотели бы обратный, чтобы получить список выбранных элементов из ListView.SelectedListViewItemCollection. Это верно? Если да, то где вы можете достичь этого.

Учитывая у вас есть список объектов User, ваш ListView может быть заполнен так:

listview.BeginUpdate(); 
foreach (User u in userList) 
{ 
    ListViewItem item = new ListViewItem() { Text = u.Name, Tag = u}; 
    listview.Items.Add(item); 
} 
listview.EndUpdate(); 

где userList список типизированных из User объектов, т.е. List<User>. Затем вы можете получить выбранные элементы в ListView:

ListViewItem[] collection = GetSelectedItems(listview); 

List<string> names = new List<string>(); 
Parallel.ForEach(collection, item => 
{ 
    User u = item.Tag as User; 
    names.Add(u.Name); 
}); 

private static ListViewItem[] GetSelectedItems(ListView listView) 
{ 
    ListViewItem[] selectedItems = new ListViewItem[0]; 

    MethodInvoker miGetSelectedItems = delegate 
    { 
     selectedItems = new ListViewItem[listview.SelectedItems.Count]; 
     listview.SelectedItems.CopyTo(selectedItems, 0); 
    }; 

    if (listview.InvokeRequired) 
    { 
     listview.Invoke(miGetSelectedItems); 
    } 
    else 
    { 
     miGetSelectedItems(); 
    } 

    return selectedItems; 
} 

Надеюсь, это поможет. Удачи!

Смежные вопросы