3

私はここに来たばかりで、事実上どこでも私の問題の答えを探しましたが、役に立ちませんでした。ここの誰かが助けてくれることを願っています。

TreeView を使用して、選択したルート フォルダーの下にフォルダー構造を表示する WinForm アプリケーションがあります。ツリービューでチェックボックスが有効になりました。TreeNode のチェックボックスをオンまたはオフにすると、その TreeNode の下に表示されているノードも変更されます。

問題は、ノードをさらに展開すると、新しい可視ノードが正しい状態に更新されないことです。

次の再帰ルーチンを使用して更新を実行しました。

    private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
    {
        foreach (TreeNode node in treeNode.Nodes)
        {
            node.Checked = nodeChecked;
            if (node.Nodes.Count > 0)
            {
                // If the current node has child nodes, call the
                // CheckAllChildNodes method recursively.
                CheckAllChildNodes(node, nodeChecked);
            }
        }
    }

このイベント ハンドラーから呼び出されます。

    private void FileTreeView_AfterCheck(object sender, TreeViewCancelEventArgs e)
    {
        // The code only executes if the user caused the checked state to change.
        if (e.Action == TreeViewAction.ByMouse)
        {
            if (e.Node.Nodes.Count > 0)
            {
                // Calls the CheckAllChildNodes method, passing in the current
                // checked value of the TreeNode whose checked state changed.
                CheckAllChildNodes(e.Node, e.Node.Checked);
            }
        }
    }

再帰関数は、実行時に見える TreeNode だけを気にしているようです。

何が間違っているのか、それを修正するために何ができるのか、誰かが手がかりを与えることができれば、それは大歓迎です.

前もって感謝します。

よろしくお願いします、

L. フンメル

4

3 に答える 3

2

2つのこと。1 つ目は、「if (e.Node.Nodes.Count > 0)」も必要ありません。これは、「foreach」を呼び出すときにノードが 0 であるかのように少し冗長であり、すぐにループから抜け出します。

2 つ目の最も簡単な解決策は、AfterExpand メソッドに接続し、ノードが展開されたときに子を設定することです。

private void FileTreeView_AfterExpandobject sender, TreeViewEventArgs e)
{
    // Calls the CheckAllChildNodes method, passing in the current
    // checked value of the TreeNode whose checked state changed.
    CheckAllChildNodes(e.Node, e.Node.Checked);        
}

また、TreeViewEventArgs だけでなく、イベント メソッドに TreeViewCancelEventArgs が必要ですか?

于 2012-06-18T01:55:30.413 に答える
1

データバインディングを使用する場合は、TreeViewの問題ではない可能性が高く、データバインディングの問題です。表示されていないコントロールは更新されません。Winforms Tabcontrolの問題については、このMSDNスレッドを参照してください。

于 2012-06-18T00:44:32.073 に答える
-1

コードで行っている可能性があることを再現しようとしましたが、このコードを使用して、それが機能しているか、同じ問題に直面しているかを確認してください。

 private void PopulateFolderTreeView(string directories, TreeNode parentNode)
            {
                string[] directoriesArray = Directory.GetDirectories(directories);
                string[] filesArrays = Directory.GetFiles(directories);
                if (directoriesArray.Length != 0)
                {
                    foreach (string currentDirectory in directoriesArray)
                    {
                        TreeNode myNode = new TreeNode(Path.GetFileNameWithoutExtension(currentDirectory));
                        if (parentNode == null)
                        {
                            treeView1.Nodes.Add(myNode);
                        }
                        else
                        {
                            parentNode.Nodes.Add(myNode);
                        }
                        PopulateFolderTreeView(currentDirectory, myNode);
                    }

                }
                if (filesArrays.Length != 0)
                {
                    foreach (string currentFile in filesArrays)
                    {
                        TreeNode myNode = new TreeNode(Path.GetFileName(currentFile));
                        if (parentNode == null)
                        {
                            treeView1.Nodes.Add(myNode);
                        }
                        else
                        {
                            parentNode.Nodes.Add(myNode);
                        }
                        //PopulateTreeView(currentDirectory, myNode);
                    }

                }
            }



     private void CheckAllChildNodes(TreeNode treeNode, bool nodeChecked)
            {
                foreach (TreeNode node in treeNode.Nodes)
                {
                    node.Checked = nodeChecked;
                    if (node.Nodes.Count > 0)
                    {
                        // If the current node has child nodes, call the
                        // CheckAllChildNodes method recursively.
                        CheckAllChildNodes(node, nodeChecked);
                    }
                }
            }

            private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
            {
                // The code only executes if the user caused the checked state to change.
                if (e.Action == TreeViewAction.ByMouse)
                {
                    if (e.Node.Nodes.Count > 0)
                    {
                        // Calls the CheckAllChildNodes method, passing in the current
                        // checked value of the TreeNode whose checked state changed.
                        CheckAllChildNodes(e.Node, e.Node.Checked);
                    }
                }

            }

この行を Form Load イベントまたは Button Click イベントに配置します

PopulateFolderTreeView(@"C:\Program Files\", null);
于 2012-06-17T23:14:10.640 に答える