У меня есть проблема с выбором определенного дочернего узла.
Чего я хочу достигнуть: Я у Вас есть этот treeview, например (один родитель с двумя дочерними узлами):
Родитель
- Ребенок со значением 5
- Ребенок со значением 2.
Я хочу добавить эти два значения и присвоить их для Порождения узла:
Родительский результат 7
- Ребенок 5
- Ребенок 2.
Конечно, больший treeview имел бы несколько родителей и много детей, и они все составят в целом один корневой узел.
Как я могу сделать это?? помогите.
спасибо,
Caslav
Не знаю, соответствует ли это вашему запросу, но при этом будут добавлены все дочерние элементы> родительский узел
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;
}
, вам следует выполнить некоторую проверку ошибок и т. Д., Чтобы сделать его надежным
Вы можете наследовать от 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;
}
}
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
Примерно так:
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;
}
}
В WinForms дочерний узел дерева знает своего Родителя. Таким образом, вы можете связаться с родителем в любое время, используя свойство TreeNode.Parent. И наоборот, каждый узел знает свои дочерние узлы. Вы можете связаться с ними с помощью Node.Nodes. В этой коллекции есть индексатор, который позволяет вам получать доступ к дочерним узлам, используя int или строку.
Чтобы найти TreeNode со специальным ключом, используйте следующий код:
treeView.Nodes.Find("nodeKey", true);
Вы можете найти описание этого метода на MSDN
Вы можете сделать что-то вроде следующего. Предполагается, что желаемое значение является частью текста (последнее значение после последнего пробела).
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);
}
}
}
}