我有一个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
。hlitem.Value.connected
为false
时的红色图像
但是我不知道关于树视图或图像列表。有谁能帮我解释一下整件事吗?
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
吗?