如何将ListViewItem转换为ListView.SelectedListViewItemCollection?

时间:2012-06-08 13:01:29

标签: c# winforms listview 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) 我的方法出了什么问题?

2 个答案:

答案 0 :(得分:0)

SelectedListViewItemCollection只是ListView的包装器,ListViewItems的Selected属性为true。但是,ListView必须可见才能正常工作。

如果您想要的是拥有未在屏幕上选择的ListView项目集合,则不应使用SelectedListViewItemCollection。

答案 1 :(得分:0)

我不确定你为什么要从ListView.SelectedListViewItemCollection得到一个列表(或集合),这是一个ListViewItem,它是ListView控件中的单个项目?看起来您会想要反转,即从ListView.SelectedListViewItemCollection获取所选项目的列表。那是对的吗?如果是这样,你可以通过哪种方式实现这一目标。

鉴于您有User个对象的列表,您的列表视图可以像这样填充:

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

其中userListUser个对象的类型列表,即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;
}

我希望这会有所帮助。祝你好运!