2009-05-19 12 views
13

Jestem nowy w języku C# i nie mam żadnego doświadczenia w programowaniu. Ale skończyłem podstawy C#. Teraz chciałbym zaprojektować prosty widok drzewa, dodając węzeł nadrzędny i węzeł potomny.dodawanie węzłów potomnych w widoku drzewa

Chciałbym dodać drugie dziecko do drugiego węzła, utknąłem tutaj i nie wiem, co dalej.

Wszelkie pomysły?

Oto kod:

private void addParentNode_Click(object sender, EventArgs e) 
    { 
     string yourParentNode; 
     yourParentNode = textBox1.Text.Trim(); 
     treeView2.Nodes.Add(yourParentNode); 
    } 

    private void addChildNode_Click(object sender, EventArgs e) 
    { 
     string yourChildNode; 
     yourChildNode = textBox1.Text.Trim(); 
     treeView2.Nodes[0].Nodes.Add(yourChildNode); 
    } 

Przepraszam, że nie było jasne, nie jestem pewien, czy naprawdę trzeba ten jeden tutaj:

//treeView1.BeginUpdate(); 
    //treeView1.Nodes.Clear(); 

Co staram się zrobić , jest dodanie węzłów nadrzędnych i węzła potomnego. W moim kodzie mogę dodać kilka węzłów nadrzędnych, ale jeśli chcę dodać węzeł podrzędny, dodaje on tylko pierwszy węzeł nadrzędny. Chcę, jeśli chcę dodać węzeł podrzędny, chcę dodać go do drugiego rodzica lub trzeciego rodzica.

w moim kodu używam tylko jeden katalogów tutaj, które nazwiska jak treeview2 Oto screenshot

to jak mój ostatni kod wygląda następująco: Zanim umieścić indziej, Dostaję błąd, gdybym nie wybieraj niczego. Tak więc zrobiłem to w ten sposób, że jeśli nic nie zostanie wybrane, doda "węzeł potomny" do "węzła domyślnego" lub (węzła nadrzędnego1). Wydaje się działać dobrze. Dzięki chłopaki ;-)

//This is for adding a parent node 
    private void addParentNode_Click(object sender, EventArgs e) 
    { 
     treeView2.BeginUpdate(); 

     string yourParentNode; 
     yourParentNode = textBox1.Text.Trim(); 
     treeView2.Nodes.Add(yourParentNode); 
     treeView2.EndUpdate(); 
    } 

    //This is for adding child node 
    private void addChildNode_Click(object sender, EventArgs e) 
    { 
     if (treeView2.SelectedNode != null) 
     { 
      string yourChildNode; 
      yourChildNode = textBox1.Text.Trim(); 

      treeView2.SelectedNode.Nodes.Add(yourChildNode); 
      treeView2.ExpandAll(); 
     } 
     //This is for adding the child node to the default node(parent 1 node) 
     else 
     { 
      string yourChildNode; 
      yourChildNode = textBox1.Text.Trim(); 
      treeView2.Nodes[0].Nodes.Add(yourChildNode); 
     } 

Dodatkowe pytanie: Czy są jakieś inne sposoby na poprawę kodu? Ponieważ tutaj zadeklaruję dwukrotnie ciąg "yourChildNode". Jedną z nich, jeśli i drugą w innym, są jakieś uproszczenia?

+0

To trochę trudne do zrozumienia, co próbujesz tutaj zrobić. Wygląda na to, że masz dwie kontrolki widoku drzewa, ale tylko jedna z nich jest w użyciu.Jakie jest znaczenie pierwszego w przykładowym kodzie? W którym punkcie hierarchii widoku drzewa chcesz dodać węzły? Być może zdjęcie lub makieta tego efektu może pomóc tutaj –

+0

--- Twoje rozwiązanie jest tutaj --- http://stackoverflow.com/questions/8861371/adding-nodes-to-a-specific-parent- node-in-a-treeview-c –

Odpowiedz

17

To nie jest takie złe, ale zapomniałeś zadzwonić pod numer treeView2.EndUpdate() w swojej metodzie addParentNode_Click().
Możesz także zadzwonić pod numer treeView2.ExpandAll() na końcu swojej metody addChildNode_Click(), aby bezpośrednio zobaczyć swój węzeł podrzędny.

private void addParentNode_Click(object sender, EventArgs e) { 
    treeView2.BeginUpdate(); 
    //treeView2.Nodes.Clear(); 
    string yourParentNode; 
    yourParentNode = textBox1.Text.Trim(); 
    treeView2.Nodes.Add(yourParentNode); 
    treeView2.EndUpdate(); 
} 

private void addChildNode_Click(object sender, EventArgs e) { 
    if (treeView2.SelectedNode != null) { 
    string yourChildNode; 
    yourChildNode = textBox1.Text.Trim(); 
    treeView2.SelectedNode.Nodes.Add(yourChildNode); 
    treeView2.ExpandAll(); 
    } 
} 

Nie wiem, czy to był błąd, czy nie, ale było 2 TreeViews. Zmieniłem go tylko 1 TreeView ...

EDIT: Odpowiedź na pytanie dodatkowe:
można zadeklarować zmienną posiadający nazwę węzła dziecko na zewnątrz w razie klauzuli:

private void addChildNode_Click(object sender, EventArgs e) { 
    var childNode = textBox1.Text.Trim(); 
    if (!string.IsNullOrEmpty(childNode)) { 
    TreeNode parentNode = treeView2.SelectedNode ?? treeView2.Nodes[0]; 
    if (parentNode != null) { 
     parentNode.Nodes.Add(childNode); 
     treeView2.ExpandAll(); 
    } 
    } 
} 

Uwaga: patrz http://www.yoda.arachsys.com/csharp/csharp2/nullable.html dla informacji o? operator.

+0

dzięki Julien, twój kod działa, ale chciałbym dodać węzeł podrzędny2 w drugim węźle nadrzędnym. Ten kod, jeśli dodaję childnode2 do parentnode2, nie działa w ten sposób. Zawsze dodaje nowe dziecko do parentnode1. – tintincutes

+0

Czy chcesz dodać węzeł potomny do ostatnio wstawionego węzła lub do wybranego węzła? –

+0

do wybranego węzła, na przykład. – tintincutes

2

Przykład dodawania węzłów podrzędnych:

private void AddExampleNodes() 
     { 
      TreeNode node; 

      node = treeView1.Nodes.Add("Master node"); 
      node.Nodes.Add("Child node"); 
      node.Nodes.Add("Child node 2"); 

      node = treeView1.Nodes.Add("Master node 2"); 
      node.Nodes.Add("mychild"); 
      node.Nodes.Add("mychild"); 
     } 
+0

Cześć Stormenet, dzięki. Ale myślę, że ten jest skończonym drzewem, czy to prawda? – tintincutes

2

To wygląda dodajesz tylko dzieci do pierwszego rodzica treeView2.Nodes[0].Nodes.Add(yourChildNode)
W zależności od tego, jak chcesz go zachować, trzeba być jawne o węzła nadrzędnego chcesz dodać dziecko do.
na przykład z ekranu, jeśli chcesz dodać dziecku do drugiego węzła musiałaby:
treeView2.Nodes[1].Nodes.Add(yourChildNode)
Jeśli chcesz dodać dzieci do aktualnie wybranego węzła, uzyskać TreeView.SelectedNode i dodaj dzieciom to.

Wypróbuj TreeView, aby dowiedzieć się, jak działa ta klasa. Niestety dokumentacja msdn jest dość lekka na próbkach kodu ...

Brakuje tu wielu kontroli bezpieczeństwa!

Coś (niesprawdzone):

private void addChildNode_Click(object sender, EventArgs e) { 
    TreeNode ParentNode = treeView2.SelectedNode; // for ease of debugging! 
    if (ParentNode != null) { 
    ParentNode.Nodes.Add("Name Of Node"); 
    treeView2.ExpandAll(); // so you can see what's been added    
    treeView2.Invalidate(); // requests a redraw 
    } 
} 
+0

Dzięki Byron, chciałbym dodać węzeł podrzędny do wybranego węzła nadrzędnego. Wspomniałeś, TreeView.SelectedNode gdzie mogę go dodać? w przycisku addParentNode lub add_ChildNode? Dzięki – tintincutes

+0

Witaj, Byron, w twoim kodzie "Treenode" jest to "TreeNode" lub "Treenode". Ponieważ jeśli piszę "Treenode", mam czerwony znak. Co oznacza, że ​​coś jest nie tak. – tintincutes

+0

pomógł mi dzięki! – Aisha

10

Mogę dodać do Stormenet przykład niektórzy KISS (Keep It Simple & Głupi):

Jeśli masz już TreeView lub po prostu stworzył instancję nim : Wypełnijmy niektóre dane - np. Jeden rodzic dwoje dziecka:

  treeView1.Nodes.Add("ParentKey","Parent Text"); 
      treeView1.Nodes["ParentKey"].Nodes.Add("Child-1 Text"); 
      treeView1.Nodes["ParentKey"].Nodes.Add("Child-2 Text"); 

Kolejny przykł. dwa rodziców najpierw dwa dziecka sekund jedno dziecko:

  treeView1.Nodes.Add("ParentKey1","Parent-1 Text"); 
      treeView1.Nodes.Add("ParentKey2","Parent-2 Text"); 
      treeView1.Nodes["ParentKey1"].Nodes.Add("Child-1 Text"); 
      treeView1.Nodes["ParentKey1"].Nodes.Add("Child-2 Text"); 
      treeView1.Nodes["ParentKey2"].Nodes.Add("Child-3 Text"); 

podjąć, jeśli dalej - sub dziecka dziecka 2:

  treeView1.Nodes.Add("ParentKey1","Parent-1 Text"); 
      treeView1.Nodes["ParentKey1"].Nodes.Add("Child-1 Text"); 
      treeView1.Nodes["ParentKey1"].Nodes.Add("ChildKey2","Child-2 Text"); 
      treeView1.Nodes["ParentKey1"].Nodes["ChildKey2"].Nodes.Add("Child-3 Text"); 

Jak widać można mieć tyle dziecka i rodzica, jak chcesz i tych, może mieć podrzędne dziecko dziecka i tak dalej .... Mam nadzieję, że pomogę!

0
void treeView(string [] LineString) 
    { 
     int line = LineString.Length; 
     string AssmMark = ""; 
     string PartMark = ""; 
     TreeNode aNode; 
     TreeNode pNode; 
     for (int i=0 ; i<line ; i++){ 
      string sLine = LineString[i]; 
      if (sLine.StartsWith("ASSEMBLY:")){ 
       sLine = sLine.Replace("ASSEMBLY:",""); 
       string[] aData = sLine.Split(new char[] {','}); 
       AssmMark = aData[0].Trim(); 
       //TreeNode aNode; 
       //aNode = new TreeNode(AssmMark); 
       treeView1.Nodes.Add(AssmMark,AssmMark); 
      } 
      if(sLine.Trim().StartsWith("PART:")){ 
       sLine = sLine.Replace("PART:",""); 
       string[] pData = sLine.Split(new char[] {','}); 
       PartMark = pData[0].Trim(); 
       pNode = new TreeNode(PartMark); 
       treeView1.Nodes[AssmMark].Nodes.Add(pNode); 
      } 
     } 
0

Możesz wykonać następujące czynności, aby wypełnić treeView węzłem nadrzędnym i podrzędnym. A także z elementem wyświetlania i wartości węzłów nadrzędnych i potomnych:

arrayRoot = taskData.GetRocordForRoot(); // iterate through database table 
    for (int j = 0; j <arrayRoot.length; j++) { 
       TreeNode root = new TreeNode(); // Creating new root node 
       root.Text = "displayString"; 
       root.Tag = "valueString"; 
       treeView1.Nodes.Add(root); //Adding the root node 

      arrayChild = taskData.GetRocordForChild();// iterate through database table 
       for (int i = 0; i < arrayChild.length; i++) { 
        TreeNode child = new TreeNode(); // creating child node 
        child.Text = "displayString" 
        child.Tag = "valueString"; 
        root.Nodes.Add(child); // adding child node 
       } 

      } 
1

Potrzebowałem zrobić coś podobnego i natknąłem się na te same problemy. Użyłem zdarzenia AfterSelect, aby upewnić się, że nie otrzymałem wcześniej wybranego węzła.

W rzeczywistości bardzo łatwo jest wskazać właściwy węzeł, aby odebrać nowy węzeł potomny.

private void TreeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e) 
{ 
    //show dialogbox to let user name the new node 
    frmDialogInput f = new frmDialogInput(); 
    f.ShowDialog(); 

    //find the node that was selected 
    TreeNode myNode = TreeView1.SelectedNode; 
    //create the new node to add 
    TreeNode newNode = new TreeNode(f.EnteredText); 
    //add the new child to the selected node 
    myNode.Nodes.Add(newNode); 
} 
0

Guys użyć tego kodu do dodawania węzłów i childNodes dla TreeView z kodu C#. *

KISS (Keep It Simple & Głupi:) *

protected void Button1_Click (object sender, EventArgs e)

{

 TreeNode a1 = new TreeNode("Apple"); 

     TreeNode b1 = new TreeNode("Banana"); 
     TreeNode a2 = new TreeNode("gree apple"); 
     TreeView2.Nodes.Add(a1); 
     TreeView2.Nodes.Add(b1); 
     a1.ChildNodes.Add(a2); 

}

+0

Nie ma "&" w KISS –

+0

To węzły. Nie ma właściwości ChildNotes. –

0
SqlConnection con = new SqlConnection(@"Data Source=NIKOLAY;Initial Catalog=PlanZadanie;Integrated Security=True"); 
     SqlCommand cmd = new SqlCommand(); 
     DataTable dt = new DataTable(); 
     public void loadTree(TreeView tree) 
     { 
      cmd.Connection = con; 
      cmd.CommandType = CommandType.Text; 
      cmd.CommandText = "SELECT [RAZDEL_ID],[NAME_RAZDEL] FROM [tbl_RAZDEL]"; 
      try 
      { 
       con.Open(); 
       SqlDataReader reader = cmd.ExecuteReader(); 
       while (reader.Read()) 
       { 
        tree.Nodes.Add(reader.GetString(1)); 
        tree.Nodes[0].Nodes.Add("yourChildNode"); 
        tree.ExpandAll(); 

       } 

       con.Close(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Ошибка с сообщением: " + ex.Message); 
      } 


     } 

+0

Odpowiadając na pytania, najlepiej wyjaśnić je bardziej szczegółowo, aby inni użytkownicy witryny mogli go łatwiej zrozumieć. – Tristan

Powiązane problemy