如何从c#中指定的图像列表中为树视图中的父节点和子节点分配图像?

时间:2014-07-23 08:25:32

标签: c# treeview

我有一个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.connectedtrue。红色图像如果{ {1}}是hlitem.Value.connected

但我不知道treeview或imagelist。 任何人都可以帮我解决整件事吗?

1 个答案:

答案 0 :(得分:0)

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;特别是如果您希望您应该包含它以防止Tree使用其默认的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);
        }
}

第一种方法仅更改直接ChildNodes,第二种方法递归地更改起始节点下的所有级别。

顺便说一句:是否有理由在代码中使用hlitem.Key.ToString()而不是sitem