将子节点从 DataTable 添加到树视图(C# Windows 窗体) [英] Adding Child Nodes to a Treeview from DataTable (C# Windows Forms)

查看:100
本文介绍了将子节点从 DataTable 添加到树视图(C# Windows 窗体)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很难让 Treeview 显示子笔记.

I'm having a hard time trying to get a Treeview to display child notes.

我有一个 DataTable,其中填充了来自查询的数据.

I have a DataTable which is filled with Data from a query.

桌子是这样的.

| ParentOT | ChildOT
  -------------------
  1        | 2
  1        | 3
  1        | 4
  4        | 5
  5        | 6

现在,我需要在 TreeView 中对这些数据进行排序.

now, what I need is to order this data in a TreeView.

结果一定是这样的(使用同一张表)

The result must be something like this (using this same table)

1
|
--2
|
--3
|
--4
  |
  --5
    |
    --6

我在 Windows 窗体上尝试过这个,我唯一能得到的是树只显示一组孩子.像这样

I tried to this on Windows Forms and the only thing I can get is the tree to show only 1 set of childs. like this

1
|
--2
|
--3
|
--4
|
--5
|
5
|
--6

我试着这样做:

DataTable arbolSub = mssql_cnn.ejecutarSqlSelect(q2);

            //Metodo 2: muestra las ot correctamente pero no muestra mas detalle de subOT.
            if (trvOTHs.Nodes.Count > 0)
            {
                trvOTHs.Nodes.Clear();
            }

            trvOTHs.BeginUpdate();

            if (arb.Rows.Count > 0)
            {
                string otPadre = arb.Rows[0][0].ToString();
                int nivel = 0;

                trvOTHs.Nodes.Add(arbolSub.Rows[0]["OT Padre"].ToString());

                for (int i = 0; i < arbolSub.Rows.Count; i++)
                {
                    //trvOTHs.Nodes.Add(arbolSub.Rows[0]["OT Padre"].ToString());                  
                    if (arbolSub.Rows[i]["OT Padre"].ToString() == otPadre)
                    {
                        if (trvOTHs.Nodes[nivel].Text == otPadre)
                        {
                            trvOTHs.Nodes[nivel].Nodes.Add(arbolSub.Rows[i]["OT Hija"].ToString());
                        }
                    }
                    else
                    {
                        otPadre = arbolSub.Rows[i+1]["OT Padre"].ToString();
                        TreeNode nodo = new TreeNode(otPadre.ToString());
                        trvOTHs.Nodes.Add(nodo);
                        nivel++;
                    }

                }


                trvOTHs.Nodes[0].Remove();

                trvOTHs.ExpandAll();
            }

            trvOTHs.EndUpdate();

其中 trvOTHs 是一个 TreeView.

where trvOTHs is a TreeView.

请帮忙!谢谢

编辑:感谢您的回复.我终于解决了这个问题,使用了一个朋友给出的想法,并使用了@Mohammad abumazen 建议的解决方案.

EDIT: Thanks for the reply. I finally worked around this,using a idea given by a friend and using something like the suggested solution by @Mohammad abumazen.

我最终递归地使用了两种方法:

I ended up using two methods recursively:

 private TreeView cargarOtPadres(TreeView trv, int otPadre, DataTable datos)
    {
        if (datos.Rows.Count > 0)
        { 
            foreach (DataRow dr in datos.Select("OTPadre='"+ otPadre+"'"))
            {
                TreeNode nodoPadre = new TreeNode();
                nodoPadre.Text = dr["OTPadre"].ToString();
                trv.Nodes.Add(nodoPadre);
                cargarSubOts(ref nodoPadre, int.Parse(dr["OTHija"].ToString()), datos);
            }
        }
        return trv;
    }

    private void cargarSubOts(ref TreeNode nodoPadre, int otPadre, DataTable datos)
    {
        DataRow[] otHijas = datos.Select("OTPadre='" + otPadre +"'");
        foreach (DataRow drow in otHijas)
        {
            TreeNode hija = new TreeNode();
            hija.Text = drow["OTHija"].ToString();
            nodoPadre.Nodes.Add(hija);
            cargarSubOts(ref hija, int.Parse(drow["OTHija"].ToString()), datos);
        }
    }

做到了.我把它留在这里以防有人需要它.再次感谢.

This did it. I leave it here in case anyone needs it. Thanks again.

推荐答案

您的代码中的主要问题是您没有在树视图中查找子父级以将其添加到 下,而是将它们全部添加到主父级下.

The main issue in your code that you are not looking for the child parent in the tree view to add it under , you add them all under main parent.

我对您的代码进行了一些更改,希望它可以直接运行或在您身边进行一些细微的更改:

i made some changes to your code hopefully it work straight forward or with minor changes at your side:

        if (arb.Rows.Count > 0)
        {
            TreeNode MainNode = new TreeNode();

            string otPadre = arb.Rows[0][0].ToString();
            int nivel = 0;

            MainNode.Text = otPadre;
            trvOTHs.Nodes.Add(MainNode);

            for (int i = 0; i < arbolSub.Rows.Count; i++)
            {        

            TreeNode child = new TreeNode();
            child.Text = row["OT Hija"].ToString();

            if (arbolSub.Rows[i]["OT Padre"].ToString() == otPadre)
            {
                MainNode.Nodes.Add(child);  
            }
            else
            {
                FindParent(MainNode, row["OT Padre"].ToString(), child);
            }

            }

            trvOTHs.ExpandAll();
        }

查找父节点的函数:

    private void FindParent(TreeNode ParentNode, string Parent, TreeNode ChildNode)
    {
        foreach (TreeNode node in ParentNode.Nodes)
        {
            if (node.Text.ToString() == Parent)
            {
                node.Nodes.Add(ChildNode); 
            }
            else
            {
                FindParent(node, Parent, ChildNode);
            }
        }
    }

这篇关于将子节点从 DataTable 添加到树视图(C# Windows 窗体)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆