3

C# のフルパスに基づいてツリービューを展開する必要があります

Node A私のツリービューには折りたたまれた2つのノードがあり、番号に展開したい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();
4

4 に答える 4

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
          } 

}

return;動作しますが、 for ループが終了しない場合、メイン関数に戻らず、 is であるため例外がスローされるpath[0]ため、BREAK (マークを付けました) を追加する必要がありますnull

于 2015-01-04T22:59:28.140 に答える
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


    }

これは完全に機能します

于 2012-09-02T10:47:11.997 に答える
0

私はうまく機能するもう少し単純なルーチンを書きました。再帰はまったくありません...これは、パスが「C:\program files\myapp」のような完全なファイルパスであると仮定し、ノードを追加するときに、ノードキーをフォルダー名と同じに設定します

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

于 2015-04-13T15:21:24.993 に答える
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;
                        }
于 2012-09-02T10:15:09.077 に答える