2010-03-23 16 views
9

मुझे एक निश्चित बच्चे नोड का चयन करने में समस्या है।TreeView में कुछ बच्चे नोड का चयन कैसे करें, सी #

मैं क्या हासिल करना चाहते हैं:
जनक
एक मूल्य के 5
एक मूल्य 2.

मैं चाहता हूँ के साथ -Child साथ -Child: मैं आप उदाहरण के लिए इस treeview (दो बच्चे नोड्स के साथ एक माता पिता) है इन दो मानों जोड़ने और उन्हें जनक नोड के लिए आवंटित:

जनक परिणाम 7
-Child 5
-Child 2.

बेशक

, एक बड़ा treeview कई माता पिता और बच्चों के बहुत सारे के लिए होता है और वे सब करने के लिए जोड़ देगा एक रूट नोड।

मैं यह कैसे कर सकता हूं ?? कृपया मदद करें।

THX,
Caslav

+4

रिकर्सन को समझने के लिए पहले रिकर्सन को समझना चाहिए। – albertjan

+0

क्या कोई भी आपूर्ति समाधान आपके लिए काम करता है? क्या आपको इसके साथ कोई अतिरिक्त मदद चाहिए? – SwDevMan81

+0

नहीं, बहुत ज्यादा वे मेरी मदद नहीं करते हैं ... मुझे नहीं पता कि मुझे क्या चाहिए, मुझे समझ में नहीं आता है, इसलिए: मुझे उन सभी मानों को जोड़ना होगा जिनमें बाल नोड्स एक मान - रूट नोड में शामिल हैं। इस पेड़ में कई माता-पिता-बच्चे-माता-पिता-बच्चे हो सकते हैं और इतने पर ... मैं दूसरे दिन सोच रहा था "क्या एक रिकर्सन मदद कर सकता है?" ?? – Caslav

उत्तर

0

पता नहीं अगर यह आपके अनुरोध से मेल खाता है, लेकिन यह सब बच्चे जोड़ देगा> माता पिता नोड

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; 
    } 

आप इसे ठोस

0
इस तरह

:

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; 
    } 
} 
+1

दोस्त, यह सिर्फ शून्य का एक समूह होगा। –

+0

हेहे बहुत सच: पी – albertjan

1
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

0

WinForms में एक पेड़ की एक childnode इसके जनक को जानता है। तो आप TreeNode.Parent संपत्ति का उपयोग कर किसी भी समय माता-पिता तक पहुंच सकते हैं। इसके विपरीत हर नोड जानता है कि यह बच्चे के नोड्स है। आप नोड नोड्स का उपयोग करके उन तक पहुंच सकते हैं। इस संग्रह में एक इंडेक्सर है जो आपको int या स्ट्रिंग का उपयोग करके बच्चे नोड्स तक पहुंचने की अनुमति देता है।

एक विशेष कुंजी उपयोग के साथ एक TreeNode ढूंढने के लिए निम्न कोड:

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

आप MSDN

+0

हां, मुझे इसके बारे में पता है। मैं इसका उपयोग करने जा रहा हूं कि जब मैं विशिष्ट बच्चे तक पहुंचूं, लेकिन इसका उपयोग कैसे करें !? – Caslav

+0

मेरे पास 10+ बच्चे हैं और वे एक ही पैरेंट नोड से नहीं हैं। और पैरेंट नोड्स (जब मूल्य जोड़ते हैं) फिर से बच्चों के रूप में कार्य करते हैं ... और इसी तरह ... इसे स्वचालित होना चाहिए (एक क्लिक आत्मा) :) – Caslav

0

में इस विधि का एक विवरण finde कर सकते हैं आप कुछ इस तरह के साथ 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; 
    } 
} 
2

आप निम्न की तरह कुछ कर सकते हैं। यह मानता है कि आप जिस मान को चाहते हैं वह टेक्स्ट का हिस्सा है (अंतिम स्थान के बाद अंतिम मूल्य)।

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); 
     } 
     } 
    } 
} 
1

मैं इस्तेमाल किया बनाने के लिए जाँच कुछ त्रुटि आदि आदि करना चाहिए एक संशोधित नाम से एक ट्रीनोड खोजने के लिए रेडबर्न के जवाब का संस्करण:

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; 
    } 
संबंधित मुद्दे