如何在treeView1中的特定节点附近添加图标/图像?

时间:2014-08-04 21:22:19

标签: c# .net winforms

这就是我将树节点和节点添加到treeView1的方式。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace ScrollLabelTest
{
    public partial class DisplayResponses : Form
    {
        private int count;
        private List<string> nodesNames = new List<string>();
        private List<TreeNode> CurrentNodeMatches = new List<TreeNode>();

        public DisplayResponses()
        {
            InitializeComponent();

            label11.Text = "0";
            count = 0;
            label9.Text = InputLanguage.CurrentInputLanguage.LayoutName;
            InputLanguageChanged += DisplayResponses_InputLanguageChanged;
            button4.Enabled = false;
            addmore();
        }

        void DisplayResponses_InputLanguageChanged(object sender, InputLanguageChangedEventArgs e)
        {
            label9.Text = InputLanguage.CurrentInputLanguage.LayoutName;
        }

        public void addmore()
        {
            for (int i = 0; i < ListsExtractions.text1.Count; i++)
            {

            }
            for (int i = 0; i < ListsExtractions.responsers.Count; i++)
            {
                if (ListsExtractions.responsers[i].Count == 0)
                {
                    ListsExtractions.responsers.RemoveAt(i);
                }
            }
            foreach (List<string> l_branch in ListsExtractions.responsers)
            {
                TreeNode l_node = treeView1.Nodes.Add(l_branch[l_branch.Count - 1]);

                for (int l_count = 0; l_count < l_branch.Count - 1; l_count++)
                {
                    l_node.Nodes.Add(l_branch[l_count]);
                }
            }
        }

响应者是List&gt;

我在treeView1中看到的是:

treeView1

现在我有另一个名单

for (int i = 0; i < ListsExtractions.text1.Count; i++)
            {

            }

它在addmore方法中 我想将text1中的每个项目与节点文本进行比较,如果它们相同,则在节点附近添加图标 该图标位于我的项目资源中。

例如在我添加的屏幕截图中,如果第一个节点在text1中相同/存在,则在右侧附近添加资源的图标。

修改

这就是我试图做的事情:

public void addmore()
        {
            for (int i = 0; i < ListsExtractions.responsers.Count; i++)
            {
                if (ListsExtractions.responsers[i].Count == 0)
                {
                    ListsExtractions.responsers.RemoveAt(i);
                }
            }
            foreach (List<string> l_branch in ListsExtractions.responsers)
            {
                TreeNode l_node = treeView1.Nodes.Add(l_branch[l_branch.Count - 1]);
                for (int l_count = 0; l_count < l_branch.Count - 1; l_count++)
                {
                    l_node.Nodes.Add(l_branch[l_count]);
                }
            }
            //AddIcons(l_node);

        }

AddIcons方法:

private void AddIcons(TreeNode l_node)
        {
            for (int i = 0; i < ListsExtractions.text1.Count; i++)
            {
                for (int x = 0; x < l_node.Nodes.Count; x++)
                {
                    if (l_node.Nodes[x].Text == ListsExtractions.text1[i])
                    {
                        //l_node.ImageIndex = 0;
                        l_node.Nodes[i].ImageIndex = 0;
                    }
                }
            }
        }

首先,我如何将l_node变量传递给AddIcons方法? 其次,我试图将l_node变量移动到表单的顶部,然后在AddIcons中,它从未进入比较中:

if (l_node.Nodes[x].Text == ListsExtractions.text1[i])

我检查了text1中的一些项目也存在于Nodes Text

我在我想要做的之前添加了屏幕截图,例如,如果第一个顶级节点text ==到text1中的一个项目,则添加图标。 然后移动到下一个节点并将其与text1中的项目进行比较 等所有节点上只有主节点而不是子节点。

例如,如果第一个节点是:

+ - 你好世界

如果hello world在text1中,则将图标添加到节点hello world

text1中的项目格式如下:

In index 0 text: hello world
In index 1 empty: ""
In index 2 text: hello
In index 3 empty: ""

这就是text1构建的方式

修改

这就是我现在尝试的:

在form1构造函数中:

InitializeComponent();

            il = new ImageList();
            il.Images.Add(Properties.Resources.stock_lock);
            treeView1.ImageList = il;

            label11.Text = "0";
            count = 0;
            label9.Text = InputLanguage.CurrentInputLanguage.LayoutName;
            InputLanguageChanged += DisplayResponses_InputLanguageChanged;
            button4.Enabled = false;
            addmore();

il是ImageList变量 和addmore方法:

public void addmore()
        {
            for (int i = 0; i < ListsExtractions.responsers.Count; i++)
            {
                if (ListsExtractions.responsers[i].Count == 0)
                {
                    ListsExtractions.responsers.RemoveAt(i);
                }
            }
            foreach (List<string> l_branch in ListsExtractions.responsers)
            {
                TreeNode l_node = treeView1.Nodes.Add(l_branch[l_branch.Count - 1]);
                if (ListsExtractions.text1.Contains(l_node.Text)) l_node.ImageIndex = 0;
                for (int l_count = 0; l_count < l_branch.Count - 1; l_count++)
                {
                    TreeNode l_subnode = l_node.Nodes.Add(l_branch[l_count]);
                    if (ListsExtractions.text1.Contains(l_subnode.Text)) l_subnode.ImageIndex = 0;
                }
            }
        }

但我得到的是每个节点都有他附近的图标,而不仅仅是那些按照文本/名称存在的文本/名称。 这就是我得到的:

All with icons

1 个答案:

答案 0 :(得分:0)

不太确定这是否是你想要的,但是如果你想在树的创建过程中进行装饰,你只需要在正确的时刻进行装饰,也就是说你需要参考新节点:

treeView1.ImageList = il;
treeView1.ImageIndex= 999;
treeView1.SelectedImageIndex= 999;


foreach (List<string> l_branch in ListsExtractions.responsers)
{
   TreeNode l_node = treeView1.Nodes.Add(l_branch[l_branch.Count - 1]);
   if (ListsExtractions.Contains (l_node.Text) )   l_node.ImageIndex = 0; 
   for (int l_count = 0; l_count < l_branch.Count - 1; l_count++)
   {
      TreeNode l_subnode = l_node.Nodes.Add(l_branch[l_count]);
      if (ListsExtractions.Contains (l_subnode.Text) ) l_subnode.ImageIndex = 0;  
   }
}

我使用Contains的{​​{1}}方法,并在创建新子节点时抓住新子节点的句柄。不需要List<T>方法。

编辑:原始版本出现错误:如果通过设置一个ImageIndex激活ImageList,则需要遵循以下几条规则:所有节点都将显示第一个图像(索引0)该列表既是默认的SelectedImageIndex,也是默认的ImageIndex。因此,您必须 在列表中包含一个空白图像,全部透明或在索引位置0的树的BackGroundColor中。因此,您必须设置装饰节点以显示索引为1的图像,作为SelectedImageIndex和ImageIndex ..

.. 您将默认索引(SelectedImageIndex和ImageIndex)设置为您在ImageIndex中不使用的数字。

请注意没有图像集的行中的间隙!您可以尝试通过创建填补空白的默认图像来修补它。:

with and without gaps

gap patcher&lt; ===这是一个适合我的。