gpt4 book ai didi

c# - 为什么 SubItems.Clear() 也会删除 Name 属性?

转载 作者:太空狗 更新时间:2023-10-30 00:46:07 27 4
gpt4 key购买 nike

我在详细信息模式下使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com