добавление дочерних узлов в дереве - PullRequest
15 голосов
/ 19 мая 2009

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

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

Есть идеи?

Вот код:

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

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

В моем коде я использую только одно древовидное представление, которое называется древовидным Вот скриншот

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

    //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" дважды. Один в том, а другой в другом, есть ли упрощение?

Ответы [ 9 ]

21 голосов
/ 19 мая 2009

Это не так уж плохо, но вы забыли вызвать 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();
  }
}

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

РЕДАКТИРОВАТЬ: Ответ на дополнительный вопрос:
Вы можете объявить переменную, содержащую имя дочернего узла, вне предложения if:

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 для получения информации о ?? оператор.

11 голосов
/ 24 августа 2011

Могу ли я добавить в пример Stormenet немного KISS (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");

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

2 голосов
/ 19 мая 2009

Похоже, вы только добавляете детей к первому родителю 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
  }
}
2 голосов
/ 19 мая 2009

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

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");
        }
1 голос
/ 07 ноября 2013

Мне нужно было сделать что-то похожее, и я столкнулся с теми же проблемами. Я использовал событие 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 голосов
/ 06 декабря 2015
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 голосов
/ 28 июля 2014

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

ПОЦЕЛУЙ (Сохраняй это простым и глупым:) *

Защищено void Button1_Click (отправитель объекта, 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 голосов
/ 14 ноября 2012

Вы можете сделать следующее, чтобы заполнить 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
                }

            }
0 голосов
/ 07 марта 2012
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);
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...