Как выбрать определенный дочерний узел в TreeView, C #

У меня проблема с выбором определенного дочернего узла.

Чего я хочу достичь: у вас есть, например, это древовидное представление (один родитель с двумя дочерними узлами):
Родитель
-Дети со значением 5
-Дети со значением 2.

Я хочу сложить эти два значения и назначить их родительскому узлу:

Родительский результат 7
-Child 5
-Child 2.

Конечно, большее древовидное представление будет иметь несколько родителей и множество потомков, и все они будут составлять один корневой узел.

Как я могу это сделать?? пожалуйста, помогите.

спасибо,
Часлав


person Caslav    schedule 23.03.2010    source источник
comment
Чтобы понять рекурсию, нужно сначала понять рекурсию.   -  person albertjan    schedule 23.03.2010
comment
Подходит ли вам какое-либо из предлагаемых решений? Вам нужна дополнительная помощь?   -  person SwDevMan81    schedule 25.03.2010
comment
Нет, в значительной степени они не знают, понимаете ли вы, что мне нужно, поэтому: мне нужно сложить все значения, которые содержат дочерние узлы, в одно значение - корневой узел. У этого дерева может быть несколько родителей-детей-родителей-детей и так далее ... Я думал на днях Может ли помочь рекурсия? ??   -  person Caslav    schedule 26.03.2010
comment
Где находятся ценности? Это часть отображаемого текста? Если это так, то решение, которое я дал, использует рекурсию и принимает последнее значение после пробела.   -  person SwDevMan81    schedule 26.03.2010
comment
Сам узел содержит значение переменной с плавающей запятой (я создал новый класс из TreeNode, то есть ExTreeNode: TreeNode).   -  person Caslav    schedule 29.03.2010
comment
Почему предлагаемые решения вам не помогают? Они не работают? Разве они не делают то, что вам нужно?   -  person Fyodor Soikin    schedule 20.04.2010


Ответы (7)


Не знаю, соответствует ли это вашему запросу, но это добавит все дочерние элементы> родительский узел

    private void button2_Click(object sender, EventArgs e)
    {
        int grandTotal = CalculateNodes(this.treeView1.Nodes);
    }
    private int CalculateNodes(TreeNodeCollection nodes)
    {
        int grandTotal = 0;
        foreach (TreeNode node in nodes)
        {
            if (node.Nodes.Count > 0)
            {
                int childTotal = CalculateNodes(node.Nodes);
                node.Text = childTotal.ToString();
                grandTotal += childTotal;
            }
            else
            {
                grandTotal += Convert.ToInt32(node.Text);
            }
        }
        return grandTotal;
    }

вы должны выполнить некоторую проверку ошибок и т. д., чтобы сделать его надежным

person riffnl    schedule 12.04.2010

Вы можете сделать что-то вроде следующего. Предполагается, что желаемое значение является частью текста (последнее значение после последнего пробела).

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TreeViewRecurse
{
   public partial class Form1 : Form
   {
      public Form1()
      {
         InitializeComponent();
         RecurseTreeViewAndSumValues(treeView1.Nodes);
      }

      public void RecurseTreeViewAndSumValues(TreeNodeCollection treeNodeCol)
      {
         int tree_node_sum = 0;
         foreach (TreeNode tree_node in treeNodeCol)
         {
            if (tree_node.Nodes.Count > 0)
            {
               RecurseTreeViewAndSumValues(tree_node.Nodes);
            }
            string[] node_split = tree_node.Text.Split(' ');
            string num = node_split[node_split.Length - 1];
            int parse_res = 0;
            bool able_to_parse = int.TryParse(num, out parse_res);
            if (able_to_parse)
            {
               tree_node_sum += parse_res;
            }
         }
         if (treeNodeCol[0].Parent != null)
         {
            string[] node_split_parent = treeNodeCol[0].Parent.Text.Split(' ');
            node_split_parent[node_split_parent.Length - 1] = tree_node_sum.ToString();
            treeNodeCol[0].Parent.Text = string.Join(" ", node_split_parent);
         }
      }
   }
}
person SwDevMan81    schedule 23.03.2010

private TreeNode SearchTree(TreeNodeCollection nodes, string searchtext)
        {
            TreeNode n_found_node = null;
            bool b_node_found = false;
            foreach (TreeNode node in nodes)
            {
                if (node.Tag.ToString() as string == searchtext)
                {
                    b_node_found = true;
                    n_found_node = node;
                }
                if (!b_node_found)
                {
                    n_found_node = SearchTree(node.Nodes, searchtext);
                }
            }
            return n_found_node;
        }

Источник: http://www.experts-exchange.com/Programming/Languages/C_Sharp/Q_21895513.html

person Jacob Saylor    schedule 23.03.2010

Я использовал модифицированную версию ответа Редберна, чтобы найти тринод по имени:

    private TreeNode GetNodeByName(TreeNodeCollection nodes, string searchtext)
    {
        TreeNode n_found_node = null;
        bool b_node_found = false;
        foreach (TreeNode node in nodes)
        {
            //show(node.Name + ":" +searchtext);
            if (node.Name == searchtext)
            {
                //show("score!");
                b_node_found = true;
                n_found_node = node;
                return n_found_node;
            }
            if (!b_node_found)
            {
                //show("here");
                n_found_node = f_get_node_by_name(node.Nodes, searchtext);
                if (n_found_node!=null)
                {
                    return n_found_node;
                }
            }
        }
        return null;
    }
person atwellpub    schedule 27.02.2012

Вы можете унаследовать от TreeNode примерно так:

public class TreeNodeEx : TreeNode {
    // only displayed when having no children
    public int Value { get; set; }

    public bool HasChildren {
        get { return Nodes.Count > 0; }
    }

    public int GetSumOfChildren() {
        if (!HasChildren)
            return Value;

        var children = Nodes.Cast<TreeNode>().OfType<TreeNodeEx>();

        int sum = 0;
        foreach (var child in children)
            sum += child.GetSumOfChildren();

        return sum;
    }
}
person Dan Tao    schedule 23.03.2010

Нравится:

public class TotalingTreeNode : TreeNode
{
    private int _value = 0;

    public int Value 
    { 
        get
        {
           if (this.Nodes.Count > 1)
              return GetTotaledValue();
           else 
               return _value;
        } 
        set
        {
           if (this.Nodes.Count < 1)
              _value = value;
        }
    }

    private int GetTotaledValue()
    {
        foreach (TotalingTreeNode t in this.Nodes.Cast<TotalingTreeNode>())
        {
            _value += t.Value;
        }
        return _value;
    }
}
person albertjan    schedule 23.03.2010
comment
Чувак, это просто суммирует кучу нулей. - person Dan Tao; 23.03.2010

В WinForms дочерний узел дерева знает своего Родителя. Таким образом, вы можете связаться с родителем в любое время, используя свойство TreeNode.Parent. И наоборот, каждый узел знает свои дочерние узлы. Вы можете связаться с ними с помощью Node.Nodes. В этой коллекции есть индексатор, который позволяет вам получать доступ к дочерним узлам, используя int или строку.

Чтобы найти TreeNode со специальным ключом, используйте следующий код:

treeView.Nodes.Find("nodeKey", true);

Описание этого метода можно найти в MSDN.

person crauscher    schedule 23.03.2010
comment
Да, я в курсе. Я собираюсь использовать это после того, как доберусь до конкретного ребенка, но как получить к нему доступ !? - person Caslav; 23.03.2010
comment
У меня более 10 детей, и они не из одного родительского узла. и родительские узлы (когда значения складываются) снова действуют как дочерние ... и так далее ... Это должно быть автоматизировано (одно нажатие кнопки) :) - person Caslav; 26.03.2010