【问题标题】:Change TreeNode image on expand-collapse events在展开折叠事件上更改 TreeNode 图像
【发布时间】:2010-04-02 12:32:41
【问题描述】:

我有一个包含许多节点的树视图。我希望 some 节点在节点折叠/展开时更改其图像。我该怎么做?

不幸的是,TreeNode 没有 ExpandNodeImage、CollapseNodeImage 等属性 \

TreeView 可以经常更改,因此可以删除/添加节点..我可以删除子节点等等...

也许,有像 ExpandAndCollapseNode 这样的类?

【问题讨论】:

    标签: c# winforms treeview


    【解决方案1】:

    1)。将 ImageList 控件添加到您的 WinForm。

    2)。使用您希望更改/显示的图片/图标填充 ImageList,以响应用户在运行时对 TreeView 所做的操作,例如展开或折叠节点。

    3)。将 'ImageList 控件分配给 'TreeView 的 'ImageList 属性

    此时,您可能希望对 TreeView 进行初始传递,假设它已填充,分配 Node.ImageIndex 属性以指向 Image... 在 ImageList ... 您要用于节点取决于它是否有孩子,或者其他什么。

    4)。例如,如果用户展开一个节点,您可以使用 TreeView 的 BeforeExpand 事件来更改节点的图片:像这样:在这种情况下,我们使用图片在 ImageList 中的索引:

        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            e.Node.ImageIndex = 3;
        }
    

    5) 您也可以使用 ImageKey 属性来设置节点的图像,该属性是图像的字符串名称

    6) 还有很多其他可能的节点图片变体可供使用:查看:SelectedImageIndex 和 SelectedImageKey:您还可以在 BeforeSelect、AfterSelect 和 BeforeExpand 事件中更改节点图片,具体取决于您所追求的效果。

    【讨论】:

    • 对我来说很奇怪,这个功能只包含在树视图级别,而不是树节点级别。
    • @Alexander 不太确定我完全理解您的评论。所有这些与节点相关的事件(BeforeExpand、AfterExpand、BeforeCollapse、AfterCollapse、BeforeSelect ... 以及 on 和 on)实际上都是与 TreeNodes 的活动相关的函数,但它们在同一文件中被定义为 TreeView 事件标准 WinForms 中控件的其他“子组件事件”被定义为控件事件的一致方式。我试图想象如果这些事件处于“TreeNode”级别会意味着什么:这是否意味着每个 TreeNode 都可以有一个单独的事件处理程序?最好的,
    • 我有时也会创建一个包含图像描述的枚举,这样您的代码中就不会出现 ImageIndex = X 了。这样一来,您的内容就更具可读性,因此当您回过头来阅读它时,您就会对正在发生的事情有所了解。
    • @Justin 好奇地问你:你认为使用枚举会比描述性命名图像/图标更具描述性,然后使用 'ImageKey 属性来设置图像/图标,而不是'图像索引 ?您可能要教我一种看待 'Enums 使用的新方法,我很高兴听到您的想法!
    • @BillW 我认为这两种方法都是可行的。出于某种原因,我一直使用 ImageIndex 而不是 ImageKey。也许是因为我是一个老 C++ 程序员,在性能方面,我总是选择整数而不是字符串。 C# 中的枚举几乎只是一个整数的掩护,所以我经常使用它们。
    【解决方案2】:

    TreeView 具有以下事件,这些事件将在节点折叠/展开时触发。

    BeforeCollapse
    BeforeExpand
    AfterCollapse
    AfterExpand
    

    【讨论】:

      【解决方案3】:

      最好用:

      treeNode.SelectedImageIndex = 1;
      

      【讨论】:

      • 选中!= 展开。
      【解决方案4】:
      BeforeCollapse
      BeforeExpand
      AfterCollapse
      AfterExpand
      

      同时使用 ImageIndex 和 SelectedImageIndex:

      private void treeView_BeforeExpand(object sender, TreeViewCancelEventArgs e)
          {
              e.Node.ImageIndex = 1;
              e.Node.SelectedImageIndex = 1;
          }
      

      【讨论】:

      • 只有在我这样做之后,我才能在 BeforeExpand 事件中更改节点图像。仅更改 ImageIndex 对我不起作用(VS 2013 社区版)。谢谢。
      【解决方案5】:

      您可以使用 AfterCollapse 和 AfterExpand 事件(在 TreeView 本身上可用)来修改节点的图像。

      您可以使用 TreeViewEventArgs 输入参数获取节点:

      private void treeView1_AfterCollapse(object sender, TreeViewEventArgs e)
      {
          e.Node.ImageIndex = 1;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-14
        • 2015-05-31
        • 1970-01-01
        • 2018-05-16
        • 1970-01-01
        • 2011-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多