TreeView не заполняется узлами

#c#

#c#

Вопрос:

Не могли бы вы помочь мне с некоторыми проблемами? Я попытался заполнить узлы treeview кодом, показанным здесь.

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();            
    }

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {           
        LoadFoldersInTreeView(treeView1);
    }
    
    private void LoadFoldersInTreeView(TreeView treeName)
    {            
        treeName.BeginUpdate();
        treeName.Nodes.Add(@"D:");
        DirectoryInfo dirInfo = new DirectoryInfo(@"D:Incoming");
        TreeNode node = new TreeNode();
        node.Text = "Files";
        GetFolders(dirInfo, node);
        treeName.Nodes[0].Nodes.Add(node);
        treeName.Update();
    }

    private void GetFolders(DirectoryInfo dirInfo, TreeNode node)
    {
        DirectoryInfo[] dInfo = dirInfo.GetDirectories();

        if (dInfo.Length > 0)
        {
            TreeNode treeNode = new TreeNode();

            foreach (DirectoryInfo driSub in dInfo)
            {
                treeNode = node.Nodes.Add(text: driSub.FullName);
                GetFolders(driSub, treeNode);
            }
        }
    }
}
  

Когда я вызываю эту процедуру из InitializeComponent(); TreeView, она заполняется, но когда я вызываю ее из checkedListBox1_ItemCheck , ничего не происходит.

Но мне нужно заполнить это дерево только тогда, когда элемент отмечен.

Комментарии:

1. Что StartLoadTreeView() делает? Ты имел в виду LoadFoldersInTreeView ? Кстати, вы пропустили treeName.EndUpdate(); в последнем.

2. Да, должны быть LoadFoldersInTreeView . Спасибо, но имя дерева. EndUpdate(); не помогает.

3. Я попробовал ваш код, и он работает, но каким-то странным образом. После установки любого флажка содержимое папки было добавлено в новый узел «Файлы». Я думаю, вам следует очистить узлы treeview перед повторным сканированием папки. И что должно быть в checkedListBox1 ?

4. Я просто пытаюсь работать с этими элементами управления и не настраиваю полный рабочий процесс. checkedListBox1.Items[e.Index].ToString() чтобы понять, какой элемент я проверил. Я не понимаю, почему у меня это не работает. TreeView все еще не заполнен.

5. BeginUpdate отключает любой рисунок в TreeView, поэтому вам нужен EndUpdate, чтобы снова включить рисование. Если код работает из конструктора, а не из метода CheckChanged, убедитесь, что событие CheckChanged подписано.

Ответ №1:

Кажется, у меня это работает

рис. 1

 public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        FillDriveFolders("E:", treeView1);
    }

    public void FillDriveFolders(string drive, TreeView tree)
    {
        DriveInfo info = new DriveInfo(drive);
        DirectoryInfo root = info.RootDirectory;
        tree.BeginUpdate();
        tree.Nodes.Clear();
        TreeNode node = tree.Nodes.Add(root.Name);
        node.Tag = root;
        RecurseFolders(node, root);
        tree.EndUpdate();
    }

    private void RecurseFolders(TreeNode node, DirectoryInfo root)
    {
        foreach (var dir in root.EnumerateDirectories())
        {
            TreeNode sub = node.Nodes.Add(dir.Name);
            sub.Tag = dir;
            RecurseFolders(sub, dir);
        }
    }
}