代码之家  ›  专栏  ›  技术社区  ›  Chris Pfohl

为什么SubItems.Clear()还会删除Name属性?

  •  4
  • Chris Pfohl  · 技术社区  · 14 年前

    我在详细模式下使用WinForms列表视图(.NET 4.0,在Windows 7上运行),我有一个函数需要清除特定项中的子项。不幸的是,当我这么做的时候,它的名字也很清楚:

    item.Name = "TESTNAME";
    item.SubItems.Clear();
    MessageBox.Show(item.Name); //shows nothing
    

    在调试器中,我跟踪到了这个,并查看了 documentation on MSDN

    清除:从集合中移除所有子项和父列表视图项。

    那里 因为在函数的后面我可以再次添加子项!

    我当然不必:

    while(item.SubItems.Count > 0)
    {
        item.RemoveAt(0);
    }
    

    是吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Ryan Lundy    10 年前

    不幸的是 ListView

    这个 Name 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);
            }
        }
    }
    

    子项目 集合的结果是清除第一个项的属性,正如您所发现的,此外还将从集合中删除所有其他项。

    实际上,发生的情况是集合被清除,但是任何试图查看 当集合为空时,它将使用默认属性值创建一个具有一个项的新集合。在上面的示例代码中,读取 子项目 托收遗嘱 automagically assign a collection with one item 如果集合不存在,则返回到内部字段。

    所以是的,这就是它的工作原理。

    实际上,要删除除第一个子项以外的所有子项,循环必须是:

    while (item.SubItems.Count > 1)
        item.SubItems.RemoveAt(1);
    
        2
  •  3
  •   Matt    14 年前

    MSDN

    注意

    ListViewItem.ListViewSubItemCollection 始终是拥有 在集合中的子项上,请确保 更改第一个 子项。

    因此,清除子项集合,也会清除父项的值。

        3
  •  0
  •   Community CDub    8 年前


    这个 ListViewItem.Text (不是 Name )是 ListViewItem.SubItems[0] 但是:
    这个 ListViewItem.SubItems.Clear() 同时清除 ListViewItem.Name

    所以,如果你用 SubItems.Clear ,然后必须同时还原 姓名 Text

    请注意2:
    如果你使用 *Key 方法(例如。 ListView.Items.ContainsKey() ListView.Items.RemoveByKey() )访问项目(而不是 *Index 一个),照顾好 ListViewItem.Name ,这是 key 你需要通过这些方法。。。

    以防任何人被迫或想要使用 ListView 我发现了另一个问题 question 23007388

    由于可能需要很长时间来确定所有这些内容,我已经发布了这个答案,即使这个线程有点老。