Как перенести элементы из treeview в richtextbox?

Я использовал foreach для решения этой проблемы. Я никогда не сталкивался с ошибкой. Но он отправляет элементы неправильно.

Я хочу сделать это так: корни: 1,2,3 и дочерние узлы: a,b,c,d,e,f. RichTextBox будет выглядеть следующим образом: 1->a — >>b->>>2->>>>c — >>>> > d->>>>>>3->>>>>>>e ->>>>>>>> f.

вот код:

foreach (TreeNode root in treeView1.Nodes)
        {

            foreach (TreeNode child in root.Nodes)
            {
               richTextBox1.SelectedText = (root.Text + "->" + child.Text);
            }


        }

Но выглядит это так: 1 — >a1 — > > b2 — >> > c2 — >>> > > d3 — >>>> > > > e3 ->>>>>> f.

Где я делаю неправильно?

1 ответ

  1. То, что вы делаете, заключается в том, что для каждой пары root->child вы записываете значение конца > TextBox. Это даст вам 1 — >a|1 — > > b / 2 — >> > c|2 — >>> > > d / 3 — >>>>> > > e|3 ->>>>>> f на каждой итерации в цикле for. Когда вы удаляете трубы и объединяете все итерации, вы получаете 1 — >a1 — >>b2 — >> > c2 — >>>> > d3 — >>>> > > > e3 ->>>>>> f, как вы опубликовали. (Это можно было найти с помощью step through debugging).

    Лучше сначала преобразовать вашу TreeViewстроку в строку, а затем добавить ее в TextBoxстроку . Ваша проблема является идеальным примером использования рекурсии . Сначала необходимо создать метод преобразования дерева в строку, а затем записать эту строку в текстовое поле. Это также регулирует A TreeViewС больше чем 2 глубокими.

    private string TreeViewToString(TreeView tv, string delimiter) {
        var result = new StringBuilder();
    
        foreach (TreeNode node in tv.Nodes) {
            TraverseNodes(node, delimited, result);
        }
    
        if (result.Length < delimiter.Length) {
            return result.ToString();
        } else {
            return result.ToString(0, result.Length - delimiter.Length); 
        }             
    }
    
    // recursive part
    private void TraverseNodes(TreeNode node, string delimiter, StringBuilder result) {
        result.AppendFormat("{0}{1}", node.Text, delimiter);      // add node to string
    
        foreach (TreeNode subNode in node.Nodes) {
            TravserseNodes(subNode, delimiter, result);           // recurse into nodes children
        }
    }
    

    Есть много способов сделать это, но есть один способ, и он должен быть довольно прямым (если вы понимаете рекурсию).