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

标签 c# .net winforms listview listviewitem

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

相关文章:

c# - 转换和解析有什么区别?

.net - 在azure云服务中支持.net版本4.6或更高版本

.net - WinForms 应用程序的常见漏洞

c# - Windows Azure 平台上的演示应用程序?

c# - 在 Excel、EPPlus、C# 中以编程方式隐藏选项卡

c# - V 模型测试方法对敏捷开发团队有用吗?

c# - 是否有一种方法可以在选择其他语言时获得自定义控件在VS编辑器中显示正确的语言

c++ - 如何从剪贴板粘贴文本?

c# - 在 onChange 事件中从动态创建的 RichTextBox 中获取文本

c# - .net core 3 preview 8 升级后 React SPA/Embedded Identity Server 问题