C# 如何从c中的assigned imagelist为treeview中的父节点和子节点分配图像?

C# 如何从c中的assigned imagelist为treeview中的父节点和子节点分配图像?,c#,treeview,C#,Treeview,我有一个树状视图和相关的图像列表。向父节点和子节点添加图像的步骤是什么 正在从代码中添加所有节点。从设计上什么也没做 public void fill_tree() { host_listbox_new.Items.Clear(); foreach (KeyValuePair<string, host_config> hlitem in host_list) { s

我有一个树状视图和相关的图像列表。向父节点和子节点添加图像的步骤是什么

正在从代码中添加所有节点。从设计上什么也没做

public void fill_tree()
        {
            host_listbox_new.Items.Clear();
            foreach (KeyValuePair<string, host_config> hlitem in host_list)
            {
                string sitem = hlitem.Key;
                if (host_list[sitem].sessionOptions == null)
                    host_list[sitem].sessionOptions = new SessionOptions();
                host_list[sitem].sessionOptions.Protocol = Protocol.Sftp;
                host_list[sitem].sessionOptions.HostName = host_list[sitem].ip;
                host_list[sitem].sessionOptions.UserName = host_list[sitem].username;
                host_list[sitem].sessionOptions.Password = host_list[sitem].password;
                host_list[sitem].sessionOptions.PortNumber = Convert.ToInt32(host_list[sitem].port);
                //host_list[sitem].sessionOptions.SshHostKeyFingerprint = host_list[sitem].rsa;

                if (treeView1.SelectedNode != null)
                {
                    treeView1.SelectedNode.Nodes.Add(hlitem.Key.ToString());

                }
                else 
                {
                    treeView1.Nodes[0].Nodes.Add(hlitem.Key.ToString());
                }



            }
        }

private void Parent_Load(object sender, EventArgs e)
        {
            read_process_config();
            read_host_config();
            host_listbox.Items.Clear();
            treeView1.BeginUpdate();
            treeView1.Nodes.Add("Servers");
            fill_tree();
            treeView1.EndUpdate();
            treeView1.ExpandAll();
            connect_server_bttn.Enabled = false;

        }
我想将项目(即子节点)添加到服务器父节点,如果hlitem.Value.connected为true,则每个项目前面都有一个图像绿色图像。如果hlitem.Value.connected为false,则显示红色图像

但我不知道treeview或imagelist。
有人能帮我解决整个问题吗?

Add命令返回对新节点的引用。可以使用它设置节点的样式。 将代码更改为:

if (treeView1.SelectedNode != null)
{
    TreeNode tn =treeView1.SelectedNode.Nodes.Add(hlitem.Key.ToString());
    tn.ImageIndex = yourIndex;

}
else 
{
    TreeNode tn =treeView1.Nodes[0].Nodes.Add(hlitem.Key.ToString());
    tn.ImageIndex = yourIndex;
}
或者任何需要设置索引的逻辑

如果需要父节点的索引,可以编写:

tn.ImageIndex = tn.Parent.ImageIndex;
您可能还希望签出Add方法的其他格式。有些允许您直接包含ImageIndex。您还可以包括所选的索引;特别是如果你不想包含它,你应该阻止树使用默认的SelectedIndex

这将设置节点以显示第二个图像,无论是否选中:

TreeNode tn =treeView1.Nodes[0].Nodes.Add(sitem, sitem, 1,1 );
由于在创建对象之前不能设置对象的属性,因此在创建父节点时不能设置子节点。相反,您可以使用一个简单的函数进行更改:

void copyImgIndexToChildren(TreeNode tn)
{
    if (tn.Nodes.Count > 0) 
        foreach (TreeNode cn in tn.Nodes) cn.ImageIndex = tn.ImageIndex;
}

void copyImgIndexToAllChildren(TreeNode tn)
{
    if (tn.Nodes.Count > 0)
        foreach (TreeNode cn in tn.Nodes)
        {
            cn.ImageIndex = tn.ImageIndex;
            copyImgIndexToAllChildren(cn);
        }
}
第一种方法仅更改直接子节点,第二种方法递归更改起始节点下方的所有级别


顺便问一下:有没有理由在代码中使用hlitem.Key.ToString而不是sitem?

在..节点前加上..前缀。添加。。使用TreeNode tn=的命令,然后可以像这样分配ImageIndex:tn.ImageIndex=0;我没抓到你。你能写得精细些吗@t树视图1的ImageIndex属性是什么?存在从imageList1集合中选择的图像。所有项目都显示相同的图像。是的,它是图像列表的索引。我想你把它分配到树视图了?每个节点都有此属性,而不是树视图本身。您需要根据您的逻辑为每个节点设置它。它们是相同的,hlitem.Key.ToString和sitemall节点父节点和子节点都显示在ImageIndex属性中设置的图像,其中ImageIndex是树视图的1。当我选择它们中的任何一个时,该特定项将显示另一个存储在ImageIndex 0中的图像。imagelist在0和1处有两个图像。您可以为整个树设置默认图像和默认选定图像。这些将显示节点是否没有自己的ImageIndex,并选择设置ImageIndex。因此,如果每个节点始终显示两个图像中的一个,则需要为每个节点设置ImageIndex。如果任何节点有时不显示图像,则需要在ImageList中包含emtpy图像。如果在选择节点时没有显示不同的图像,则需要将SelecteIndex设置为与ImageIndex相同的值。