2009-05-19 5 views
13

Я новичок в C# и не имею никакого опыта программирования. Но я закончил основы C#. Теперь я хотел бы создать простой древовидный вид, добавив родительский узел и дочерний узел.Добавление дочерних узлов в treeview

Я хотел бы добавить второго ребенка для второго узла, я совершенно застрял здесь и не знаю, что будет дальше.

Любые идеи?

Вот код:

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

К сожалению, я не ясно, я не уверен, что на самом деле нужно это здесь:

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

То, что я пытаюсь сделать , заключается в добавлении родительских узлов и дочернего узла. В моем коде я могу добавить несколько родительских узлов, но если я хочу добавить дочерний узел, он добавит только в первый родительский узел. Я хочу, чтобы, добавив дочерний узел, я хочу добавить его ко второму родительскому или третьему родительскому элементу.

В моем коде я использую только один TreeView здесь, имена, как treeview2 Вот является screenshot

это как мой окончательный код выглядит следующим образом: Перед тем, как поставить еще, я получаю сообщение об ошибке, если я ничего не выбирайте. Поэтому я сделал так, что если ничего не будет выбрано, он добавит «дочерний узел» к «узлу по умолчанию» или (родительский узел 1). Кажется, это работает хорошо. Спасибо, ребята ;-)

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

Вопрос: Есть ли другие способы улучшения кода? Потому что здесь я объявляю строку «yourChildNode» дважды. Одно в if и другом в другом, есть ли какое-либо упрощение?

+0

Трудно понять, что вы здесь делаете. Кажется, у вас есть два элемента управления деревом, но используется только один из них.Какова актуальность первого в вашем примере кода? В какой момент в иерархической иерархии дерева вы хотите добавить узлы? Возможно, скриншот или макет эффекта могут помочь здесь –

+0

--- Ваше решение есть --- http://stackoverflow.com/questions/8861371/adding-nodes-to-a-specific-parent- node-in-a-treeview-c –

ответ

17

Это не так уж плохо, но вы забыли позвонить treeView2.EndUpdate() в свой addParentNode_Click() метод.
Вы также можете позвонить treeView2.ExpandAll() в конце своего метода addChildNode_Click(), чтобы сразу увидеть ваш дочерний узел.

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

Я не знаю, была ли это ошибка или нет, но было 2 TreeViews. Я изменил его только 1 TreeView ...

EDIT: Ответ на дополнительный вопрос:
Вы можете объявить переменную, содержащий имя дочернего узла за пределами, если п:

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

Примечание: см http://www.yoda.arachsys.com/csharp/csharp2/nullable.html для информации о ?? оператор.

+0

спасибо Julien, ваш код работает, но я хотел бы добавить дочерний узел2 во второй родительский узел. С помощью этого кода, если я добавлю childnode2 в parentnode2, это не будет сделано. Он всегда добавляет новый ребенок к parentnode1. – tintincutes

+0

Вы хотите добавить дочерний узел к последнему вставленному узлу или к выбранному узлу? –

+0

к выбранному узлу, например. – tintincutes

2

Пример добавления дочерних узлов:

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

Привет, Stormenet, спасибо. Но я думаю, что это готовое дерево, верно? – tintincutes

2

Похоже, вы только добавление детей первого родителя treeView2.Nodes[0].Nodes.Add(yourChildNode)
В зависимости от того, как вы хотите, чтобы вести себя, вы должны быть четко о родительском узле вы хотите добавить ребенка.
Для примера, с вашего экрана, если вы хотите добавить ребенок ко второму узлу вам потребуется:
treeView2.Nodes[1].Nodes.Add(yourChildNode)
Если вы хотите добавить ребенок к выбранному узлу, получить TreeView.SelectedNode и добавить ребенок Это.

Попробуйте TreeView, чтобы получить представление о том, как работает класс. К сожалению, документация msdn довольно легка на образцах кода ...

Здесь я пропустил целый ряд проверок безопасности!

Что-то вроде (непроверенные):

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

Спасибо Byron, я хотел бы добавить дочерний узел к выбранному родительскому узлу. Вы упомянули, TreeView.SelectedNode , где я могу его добавить? в кнопке addParentNode или add_ChildNode? Спасибо – tintincutes

+0

Привет Байрон, в вашем коде «Treenode» это «TreeNode» или «Treenode». Потому что, если я наберу «Treenode», я получил красную метку. Это означает, что что-то не так. – tintincutes

+0

помог мне поблагодарить! – Aisha

10

Могу ли я добавить к Stormenet например, некоторые ПОЦЕЛУЙ (Keep It Simple & Stupid):

Если у вас уже есть TreeView или просто создал экземпляр этого : Заполним некоторые данные - Исх. Один родитель: двое детей:

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

Другой пример. два родитель первым есть два второй ребенок один ребенок:

  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"); 

Принять, если дальше - к югу от ребенка ребенка 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"); 

Как вы видите, вы можете иметь столько, сколько ребенка и родителей, как вы хотите, и те, может иметь дочерний ребенок ребенка и т. д .... Надеюсь, что я помогу!

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

Вы можете сделать следующее, чтобы заполнить treeView родительским и дочерним узлом. А также с отображением и значением члена родительского и дочернего узлов:

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

Мне нужно было сделать что-то подобное и натолкнулись на те же проблемы. Я использовал событие AfterSelect, чтобы убедиться, что я не получил ранее выбранный узел.

На самом деле очень просто ссылаться на правильный узел, чтобы получить новый дочерний узел.

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

Ребята используют этот код для добавления узлов и ChildNodes для TreeView из C# код. *

ПОЦЕЛУЙ (Keep It Simple & Stupid:) *

защищен недействительным Button1_Click (объект отправителя, EventArgs е)

{

 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

В KISS нет «&» –

+0

Это узлы. Нет свойства 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

При ответе на вопросы лучше всего объяснить более подробно, чтобы другие пользователи сайта могли быть легко понятны. – Tristan

Смежные вопросы