我在详细信息模式下使用 WinForms ListView(.NET 4.0,在 Windows 7 上运行)并且我有一个函数需要清除特定项目中的子项目。不幸的是,当我这样做时,它也清楚了名字:
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# - 为什么 SubItems.Clear() 也会删除 Name 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4097912/