我需要根据c#
中的完整路径展开我的树视图我的树状视图有2个已折叠的节点,我想将Node A
展开为数字3
所以我有节点A\1\2\3
的完整路径。
如何根据完整路径单步执行并打开每个节点?此外,完整路径的长度可能会发生变化,因此我可能需要将节点打开为级别6 。所以它需要基于完整路径完成。任何帮助都会很棒。
Node A
1
2
3
Node B
1
2
3
4 5 6
这是我尝试过的:
TreeNode [] n= treeView1.Nodes.Find(search, true);
if (n.Length > 0)
found = true;
treeView1.Nodes[t].Collapse();
foreach (TreeNode p in n) {
string[] a = p.FullPath.Split('\\');
foreach (string b in a) {
treeView1.SelectedNode = treeView1.Nodes[b];
treeView1.SelectedNode.Expand();
答案 0 :(得分:3)
我很抱歉没有评论S3ddi9给出的上述答案是正确的。我只是在添加一些东西。
所以S3ddi9给出了答案
...
string path = @"A\1\2\";
var path_list = path.Split('\\').ToList();
foreach (TreeNode node in treeView1.Nodes)
if (node.Text == path_list[0])
ExpandMyLitleBoys(node, path_list);
}
private void ExpandMyLitleBoys(TreeNode node, List<string> path)
{
path.RemoveAt(0);
node.Expand();
if (path.Count == 0)
return;
foreach (TreeNode mynode in node.Nodes)
if (mynode.Text == path[0])
{
ExpandMyLitleBoys(mynode, path); //recursive call
break; //this was missing in earlier answer
}
}
是否有效,但是你必须添加一个BREAK(我标记它),因为如果for循环没有完成,return;
将不会返回你的主函数,它会抛出异常,因为path[0]
为null
。
答案 1 :(得分:1)
我希望这会更简单,对于 Treeviews ,最好的方法是使用递归方法
...
string path = @"A\1\2\";
var path_list = path.Split('\\').ToList();
foreach (TreeNode node in treeView1.Nodes)
if (node.Text == path_list[0])
ExpandMyLitleBoys(node, path_list);
}
private void ExpandMyLitleBoys(TreeNode node, List<string> path)
{
path.RemoveAt(0);
node.Expand();
if (path.Count == 0)
return;
foreach (TreeNode mynode in node.Nodes)
if (mynode.Text == path[0])
ExpandMyLitleBoys(mynode, path); //recursive call
}
这完美地完成了工作
答案 2 :(得分:0)
破解了!!
TreeNode[] n = treeView1.Nodes.Find(search, true);
if (n.Length > 0)
found = true;
treeView1.Nodes[t].Collapse();
foreach (TreeNode p in n)
{
i = 0;
string[] a = p.FullPath.Split('\\');
foreach (string b in a)
{
if (i == 0)
{
treeView1.SelectedNode = treeView1.Nodes[b];
current = treeView1.Nodes[b];
treeView1.SelectedNode.Expand();
i = 1;
}
else
{
treeView1.SelectedNode = current.Nodes[b];
current = current.Nodes[b];
treeView1.SelectedNode.Expand();
if (b.ToUpper().Contains(search))
{
treeView1.SelectedNode.BackColor = System.Drawing.Color.Red;
}
答案 3 :(得分:0)
我写了一个更简单的例程,效果很好。根本没有递归... 这假设您的路径是一个完整的文件路径,如...“C:\ program files \ myapp”,当您添加节点时,您将节点Key设置为等于文件夹名称
string[] strFolders = strPath.Split('\'));
System.Windows.Forms.TreeNode CurrentNode = null;
System.Windows.Forms.TreeNode[] FoundNodes = null;
foreach (string folder in strFolders) {
if (!folder.Contains(":")) {
if (CurrentNode == null) {
FoundNodes = treeFolders.Nodes.Find(folder, false);
} else {
FoundNodes = CurrentNode.Nodes.Find(folder, false);
}
if (FoundNodes.Length > 0) {
CurrentNode = FoundNodes[0];
CurrentNode.Expand();
} else {
//no folder found. cant continue
break;
}
}
}
if (CurrentNode != null) {
treeFolders.SelectedNode = CurrentNode;
}
答案 4 :(得分:0)
这是我在树视图中展开目录的代码。
1:我从目录中删除“:”并将路径拆分为目录名称的字符串列表。
2:我调用一个方法,该方法使用递归来搜索当前节点中的目录,并使用索引来跟踪当前目录。
3:当我找到目录时,我展开节点,然后重新调用该方法继续寻找匹配。
private void button1_Click(object sender, EventArgs e)
{
List<string> txtNodes = (@"C:\AMD\WU-CCC2".Replace(":", "")).Split(Convert.ToChar(@"\")).ToList<string>();
expandNodes(treeView1.Nodes, txtNodes, 0);
}
public void expandNodes(TreeNodeCollection nodes, List<string> txtNodes, int index)
{
string txtnode = txtNodes[index];
foreach (TreeNode node in nodes)
{
if (node.Text == txtnode)
{
node.Expand();
if (txtNodes.Count> index +1)
{
expandNodes(node.Nodes, txtNodes, ++index);
}
}
}
}