В С#, как установить все узлы дерева, проверенные сразу после загрузки дерева

У меня есть TreeView в сборке WindowForm на C#. В этом древовидном представлении файлы загружаются успешно. Я также реализовал флажки, отображающиеся перед каждым узлом дерева.

Теперь я хочу, чтобы все флажки были отмечены как true по умолчанию после загрузки всех каталогов в treeview. Я попробовал следующий код, но не повезло. Он просто проверяет только корневой узел, а не все подузлы. Первый метод btnDirectoryPath_Click(object sender, EventArgs e) предназначен для нажатия кнопки, которая выбирает путь к загружаемому каталогу. Отсюда я звоню setAllCheckedTrue(TreeView treeView1)

private void btnDirectoryPath_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.SelectedPath = txtDirectoryPath.Text;
            DialogResult drResult = folderBrowserDialog1.ShowDialog();
            if (drResult == System.Windows.Forms.DialogResult.OK)
            {
                txtDirectoryPath.Text = folderBrowserDialog1.SelectedPath;

                // Setting Inital Value of Progress Bar
                progressBar1.Value = 0;
                // Clear All Nodes if Already Exists
                treeView1.Nodes.Clear();
                toolTip1.ShowAlways = true;
                if (txtDirectoryPath.Text != "" && Directory.Exists(txtDirectoryPath.Text))
                {
                    //Loading all directories and sub directories and files
                    LoadDirectory(txtDirectoryPath.Text);
                    //setting all checkboxes true by default on loading.
                    setAllCheckedTrue(treeView1);
                }
                else
                    MessageBox.Show("Select Directory!!");
            }
        }

private void setAllCheckedTrue(TreeView treeView1)
        {
            foreach(TreeNode treeNode in treeView1.Nodes)
            {
                treeNode.Checked = true;
            }
        }

Ниже приведен снимок моего дерева -

Снимок моего дерева

Еще одно сомнение заключается в том, как обрабатывать событие загрузки дерева? Есть ли в С# какая-то конкретная вещь для обнаружения события загрузки дерева?

Я новичок в C #, пожалуйста, помогите мне, если это возможно. Спасибо!


person Tanmay Bairagi    schedule 20.11.2019    source источник
comment
Обновите функцию setAllCheckedTrue, чтобы обрабатывать узлы, имеющие дочерние узлы. после строки treeNode.Checked = true; , добавьте текущую строку: if (treeNode.Nodes.Count › 0) ){setAllCheckedTrue(treeNode)}.   -  person LPGTE SOFTS    schedule 20.11.2019


Ответы (2)


Вам также нужна рекурсивная функция для проверки всех подузлов. TreeView не делает этого автоматически. Вы также должны подумать, как обрабатывать обновление родительских узлов, когда вы отменяете выбор подузла.

Попробуйте что-то подобное для установки подузлов:

private void SetAllCheckedTrue(TreeView treeView1)
{
    foreach(TreeNode treeNode in treeView1.Nodes)
    {
          SetTreeNodeCheckbox(treeNode , true);
    }
}

private void SetTreeNodeCheckbox(TreeNode treeNode , bool value)
{
     treeNode.Checked = value;
     foreach(var subNode in currentNode)
     {
         SetTreeNodeCheckbox(subNode, value);
     }
 }
person Mihaeru    schedule 20.11.2019
comment
Спасибо дружище!! Я просто упустил эту логику ;-) На самом деле я реализовал это в каком-то другом сценарии. - person Tanmay Bairagi; 20.11.2019

Сначала замените приведенный ниже код

setAllCheckedTrue(treeView1);

с приведенными ниже инструкциями

foreach(TreeNode node in treeView1.Nodes)
{         
  setAllCheckedTrue (node);
}   

Это изменит тип параметра, отправляемого в функцию «setAllCheckedTrue», которая станет узлом, а не древовидной структурой, и обновит функцию setAllCheckedTrue с помощью приведенной ниже функции.

private void setAllCheckedTrue(TreeNode node)
{
    node.Checked = true;
    foreach(TreeNode childnode in node.Nodes)
    {   
    setAllCheckedTrue (childnode);
    }
}

Сердечно

person LPGTE SOFTS    schedule 20.11.2019
comment
Это уже решено! Хотя, спасибо, что откликнулись! - person Tanmay Bairagi; 20.11.2019