2

次のコードを書いて、 my を繰り返し、指定さTreeviewれたフルパスを見つけました。

正しい位置を取得し、listview正しいコンテンツも表示されますが、treeview展開されません。.Expand()メソッドが起動していないようです。

それは何についてですか?

を持つフォームTreeviewはダイアログであり、プログラムの開始時に一度初期化され、必要に応じて更新されて表示されます。

深層には膨大な数のフォルダーがあるため、2 レベルのフォルダーを下にロードし、それぞれを手動で展開します。

ダイアログを再度表示する前に、SelectedPath展開する必要があるフル パスを設定し、ExpandToPathメソッドを呼び出します。

    private void treeView1_BeforeExpand(object sender, System.Windows.Forms.TreeViewCancelEventArgs e) {
        if(e.Node.Tag != null && e.Node.Nodes.Count > 0)
            PopulateTreeView(e.Node, 1);
    }



    private void PopulateTreeView(TreeNode node, int depth) {

        if(node.Tag != null) {

            TreeViewTag tag = node.Tag as TreeViewTag;
            if(tag.Visited && node.Nodes.Count > 0) {

                foreach(TreeNode n in node.Nodes) {
                    if(depth <= 1)
                        PopulateTreeView(n, depth + 1);
                }

            } else {

                TreeNode aNode;
                try {
                    DirectoryInfo[] infos = tag.Info.GetDirectories();

                    foreach(DirectoryInfo subDir in infos) {
                        try {
                            aNode = new TreeNode(subDir.Name, 0, 0);
                            aNode.Tag = new TreeViewTag() { Info = subDir, Visited = true };
                            aNode.ImageKey = "folderOpen";

                            if(depth <= 1)
                                PopulateTreeView(aNode, depth + 1);

                            node.Nodes.Add(aNode);
                        } catch(UnauthorizedAccessException ex11) {
                        } catch(Exception ex12) {
                        }

                    }
                } catch(UnauthorizedAccessException ex1) {
                } catch(Exception ex2) {
                }
            }
        }
    }


    public void ExpandToPath(string path) {
        currentNodeInfo = new DirectoryInfo(path);

        TreeNode root = this.treeView1.Nodes[0];
        if(path.EndsWith(Path.DirectorySeparatorChar.ToString()))
            path = path.Substring(0, path.Length - 1);

        Stack<TreeNode> search = new Stack<TreeNode>();
        search.Push(root);

        while(search.Count > 0) {
            TreeNode current = search.Pop();
            string compare = (current.Tag as TreeViewTag).Info.FullName;
            if(path.Equals(compare)) {
                current.Expand();
                PopulateListView((current.Tag as TreeViewTag).Info);
                break;
            } else {
                if(path.StartsWith(compare)) {
                    current.Expand();
                    foreach(TreeNode node in current.Nodes) {
                        search.Push(node);
                    }
                }
            }
        }
        search.Clear();
        search = null;
    }
4

0 に答える 0