如何在c#中为树视图中的父节点和子节点分配图像



我有一个TreeView和一个关联的ImageList。向父节点和子节点添加图像的步骤是什么?

所有节点都是从代码中添加的。设计没有完成任何事情。

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.connectedtruehlitem.Value.connectedfalse时的红色图像

但是我不知道关于树视图或图像列表。有谁能帮我解释一下整件事吗?

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

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;特别是如果你不希望包含它,以防止树使用其默认的selecteindex !

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

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);
        }
}

第一个方法只改变直接的ChildNodes,第二个方法递归地改变起始节点以下的所有级别。

BTW:有理由在你的代码中使用hlitem.Key.ToString()而不是sitem吗?

最新更新