Есть ли способ вернуть список отмеченных полей в TreeView [C #]

#c# #visual-studio #treeview

#c# #visual-studio #просмотр дерева

Вопрос:

Вот что я попробовал

 namespace USCS
{
    public partial class Form5 : Form
    {
        List<String> CheckedNodes = new List<String>();
        public Form5()
        {
            
            InitializeComponent();
            InitializeTreeView();
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {

        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void toolTip1_Popup(object sender, PopupEventArgs e)
        {
            
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void treeView1_AfterSelect_1(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Checked)
            {
                CheckedNodes.Add(e.Node.FullPath.ToString());
            }
            else
            {
                CheckedNodes.Remove(e.Node.FullPath.ToString());
            }
        }

        private void treeView1_AfterSelect_2(object sender, TreeViewEventArgs e)
        {
            if (e.Node.Checked)
            {
                CheckedNodes.Add(e.Node.FullPath.ToString());
            }
            else
            {
                CheckedNodes.Remove(e.Node.FullPath.ToString());
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Behavior desc_behav = new Behavior();
            
            setBehaviorData(desc_behav);
           // Form5.ActiveForm.Hide();
           // var myForm = new Form5();
         //   myForm.Show();
        }
        private void InitializeTreeView()
        {
            treeView1.BeginUpdate();
            treeView1.Nodes.Add("Parent");
            treeView1.Nodes[0].Nodes.Add("Child 1");
            treeView1.Nodes[0].Nodes.Add("Child 2");
            treeView1.Nodes[0].Nodes[1].Nodes.Add("Grandchild");
            treeView1.Nodes[0].Nodes[1].Nodes[0].Nodes.Add("Great Grandchild");
            treeView1.EndUpdate();
            
        }


        private void setBehaviorData(Behavior desc_behav)
        {
            var message = CheckedNodes[0];
            MessageBox.Show(message.ToString());



        }
        private void Traverse(TreeNodeCollection nodes)
        {
            String f;

            foreach (TreeNode node in nodes)
            {
                f = node.Text;
                Traverse(node.Nodes);
            }
            

        }
    }
}
  

Как вы можете видеть, я пытаюсь получить «путь к файлу» выбранных пользовательских полей в TreeView. Я просто продолжаю получать сообщения об ошибках, которые «индексируют вне диапазона», что не имеет смысла, потому что он тянет за индекс 0, или когда я пытаюсь вызвать список напрямую, я просто получаю сообщение System.checkednodes[system].

Буквально просто хочу, чтобы он вернул строку с именем path.

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

1. Вероятно, вы получаете событие во время построения дерева. Поэтому просто добавьте оператор if для CheckedNodes. Количество > 0

Ответ №1:

Вы хотите получить все отмеченные узлы в treeview? Если это так, вы можете попробовать использовать рекурсию и подписаться на treeView_AfterCheck .

Вот простая демонстрация, на которую вы можете сослаться.

 private void Form1_Load(object sender, EventArgs e)
{
    treeView1.CheckBoxes = true;
}

List<String> CheckedNodes = new List<String>();

private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
    CheckedNodes = GetCheckedNodes(treeView1.Nodes);
    foreach (var i in CheckedNodes)
    {
        Console.WriteLine(i);
    }
}

public List<string> GetCheckedNodes(TreeNodeCollection nodes)
{
    List<string> nodeList = new List<string>();
    if (nodes == null)
    {
        return nodeList;
    }

    foreach (TreeNode childNode in nodes)
    {
        if (childNode.Checked)
        {
            nodeList.Add(childNode.FullPath);
        }
        nodeList.AddRange(GetCheckedNodes(childNode.Nodes));
    }
    return nodeList;
}
  

Ответ №2:

Вы могли бы использовать что-то вроде этого:

 private void button1_Click(object sender, EventArgs e)
{
    List<string> checkedNodes = new List<string>(CheckedNodes(treeView1));
    foreach(string path in checkedNodes)
    {
        Console.WriteLine(path);
    }
}

private IEnumerable<String> CheckedNodes(TreeView tv)
{
    foreach (string path in CheckedNodes(tv.Nodes))
    {
        yield return path;
    }
}

private IEnumerable<String> CheckedNodes(TreeNodeCollection tnCol)
{
    foreach (TreeNode tn in tnCol)
    {
        if (tn.Checked)
        {
            yield return tn.FullPath;
        }
        if (tn.Nodes.Count > 0)
        {
            foreach (String path in CheckedNodes(tn.Nodes))
            {
                yield return path;
            }
        }
    }
}