【问题标题】:how do I convert an ListViewItem to a ListView.SelectedListViewItemCollection?如何将 ListViewItem 转换为 ListView.SelectedListViewItemCollection?
【发布时间】:2012-06-08 13:01:29
【问题描述】:

我想从 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) 我的方法有什么问题?

【问题讨论】:

  • 你能给我们更广泛的了解吗?你想用这里的返回值做什么?我怀疑有更好的方法来实现您的目标。
  • 你应该返回IEnumerable<T>
  • 从未尝试过,但我会说克隆是问题所在。选择的项目应该是那些选择为真的项目。

标签: c# winforms listview listviewitem


【解决方案1】:

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

如果您想要的是在屏幕上没有选择的 ListView 项目的集合,那么您不应该使用 SelectedListViewItemCollection。

【讨论】:

    【解决方案2】:

    我不确定您为什么要从ListViewItem(ListView 控件中的单个项目)获取列表(或集合),这就是ListView.SelectedListViewItemCollection 的含义?您似乎想要相反的情况,即从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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      • 2021-08-12
      相关资源
      最近更新 更多