我有一个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.connected
是true
。红色图像如果{ {1}}是hlitem.Value.connected
)
但我不知道treeview或imagelist。 任何人都可以帮我解决整件事吗?
答案 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
?