我在Form2中有一个列表视图,现在我希望此Listview中的项目与Form1中的Listview中的项目相同。有没有像:
listview1.Items = Form1.listview1.Items
答案 0 :(得分:0)
Items
属性作为一个整体是只读的。所以你的代码不能编译。
ListViewItem
只能加入一个 ListViewItemCollection
。因此,尝试将所有项添加到第二个ListView
的代码将在运行时失败。但是你可以创建Items的克隆..
如果你只想要Items
的副本,你可以这样做:
foreach (ListViewItem lvi in listView1.Items)
listView2.Items.Add((ListViewItem)lvi.Clone());
或者使用LINQ,这通常会更短:
listView2.Items.AddRange(listView1.Items.Cast <ListViewItem>()
.Select(x => (ListViewItem)x.Clone())
.ToArray());
这次LINQ实际上更长用它的转换来编写而不是简单的循环..
请注意,Clone
只能创建“浅”副本。这意味着虽然值类型(如所有字符串属性都被复制到新的独立字符串中),但副本的引用属性仅包含引用的副本,因此它们仍指向同一对象。因此,如果您向引用另一个Tag
的{{1}}添加ListViewItem A
,则克隆的Item B
也将指向Item C
。
可能不是问题,但重要的是要记住..
Item B
并不擅长ListView
。因此,如果您希望实际共享相同的数据,您需要编写同步LV的代码,或者查看将数据绑定添加到LV子类(如this one)的项目。
另请注意,您显然需要引用两个DataBinding
。在构造函数中传递要访问的ListViews
或对整个Control
的引用是一种常见的方法。在后一种情况下,不要忘记制作修饰符Form
! - 对于这些技术,这里有近23万亿个答案; - )
答案 1 :(得分:-1)
你可以使listview1成为一个静态成员,这样你就可以这样访问它:
public static ListView listview1 {get; set;}
在构造函数中,您可以将ListView设置为:
public Form1()
{
listview1 = this.YourListView;
}
编辑:
我不确定你是否可以这样做: listview2.items = listview1.items;
但您可以遍历listview1中的每个项目并将其添加到listview2
答案 2 :(得分:-1)
只要它们属于同一类型,使用AddRange就非常简单:
list2.AddRange(list1的);