c# – 为什么SubItems.Clear()也删除了Name属性?
作者:互联网
我在详细模式(.NET 4.0,在Windows 7上运行)中使用WinForms ListView,并且我有一个需要清除特定项目中的子项的函数.不幸的是,当我这样做时,它也清楚了这个名字:
item.Name = "TESTNAME";
item.SubItems.Clear();
MessageBox.Show(item.Name); //shows nothing
在调试器中我跟踪了它,我看了documentation on MSDN并且它没有用,
Clear: Removes all subitems and the parent ListViewItem from the collection.
除了ListViewItem仍然非常存在,因为稍后在函数中我能够再次添加SubItems!
当然,我不必:
while(item.SubItems.Count > 0)
{
item.RemoveAt(0);
}
我呢?
解决方法:
不幸的是,ListView是一个奇怪的野兽,其中一个奇怪的角落是它的项目只是要显示的值的集合,每列一个.
Name属性只是自动将东西放入第一列,不幸的是,这个“东西”存在于SubItems集合中.
这意味着如果您检查SubItems集合,您会注意到它已经有一个元素,并且在设置项目的名称后,您将看到该项目的文本等于该名称.
这是ListViewItem.Name
property的代码:
public string Name {
get {
if (SubItemCount == 0) {
return string.Empty;
}
else {
return subItems[0].Name;
}
}
set {
SubItems[0].Name = value;
}
}
而ListViewSubItem.Name
property看起来像这样:
public string Name {
get {
return (name == null) ? "": name;
}
set {
name = value;
if (owner != null) {
owner.UpdateSubItems(-1);
}
}
}
因此,除了从集合中删除所有其他项目之外,清除SubItems集合的结果是清除第一个项目的属性,如您所发现的那样.
实际上,发生的事情是清除了集合,但是任何在SubItems集合为空时查看它的尝试都会创建一个带有一个项目的新集合,其默认属性值.在上面的示例代码中,如果集合尚未存在,则读取SubItems集合将automagically assign a collection with one item发送到内部字段.
所以是的,这就是它的“工作原理”.
事实上,要删除除第一个以外的每个子项,您的循环必须是:
while (item.SubItems.Count > 1)
item.SubItems.RemoveAt(1);
标签:c,net,winforms,listview,listviewitem 来源: https://codeday.me/bug/20190526/1157705.html