Winfrom开发之动态生成TreeView树形菜单

在项目开发的过程中,树状结构用的很多,树结构不但能够很好的分类汇总,而且还能明确层次关系,方便操作

这里写一个简单的C#填充数的程序,一般要填充树状结构就会用递归的方法

先看数据库表结构:

 

 

 

parentID为改name的父节点id

C#代码:

Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> 1  private void button1_Click(object sender, EventArgs e)
        {
            DataSet ds = GetData();
            if (ds.Tables.Count <= 0) return;
            NodeAdd(treeView1, ds.Tables[0], true);
        }

        private static DataSet GetData()
        {
            using (SqlConnection con = new SqlConnection("data source=.;initial catalog=Test;user id=sa"))
            {
                con.Open();
                SqlCommand cmd = new SqlCommand("select * from Student", con);
                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                adapter.Fill(ds);
                return ds;
            }
        }

        //填充数
        private static void NodeAdd(TreeView tree, DataTable table, bool expandall)
        {
            foreach (DataRow row in table.Rows)
            {
                string id = row["id"].ToString().Trim();
                string name = row["name"].ToString().Trim();
                string parentID = row["parentID"].ToString().Trim();

                TreeNode node = new TreeNode(name);
                node.Tag = id;
                //在树中根据id来查找这个节点,如果没有找到,则说明这个节点是父节点,如果查找到这个节点,则返回,返回的节点为node节点的父节点
                TreeNode parentNode = GetNodeByID(tree,parentID);
                if (parentNode == null)
                {
                    tree.Nodes.Add(node);
                }
                else  //如果不为空,则说明当前的节点为返回节点(parentNode)的子节点
                {
                    parentNode.Nodes.Add(node);
                }
                if (expandall)
                {
                    tree.ExpandAll();
                }
            }
        }

        private static TreeNode GetNodeByID(TreeView tree, string id)
        {
            TreeNode result = null;
            foreach (TreeNode node in tree.Nodes)
            {
                if (node.Tag.ToString() == id)
                {
                    result = node;
                    break;
                }
                //判断当前节点是不是要查找的节点,如果不是,则查看当前节点是否有子节点,然后递归判断
                if (node.Nodes.Count > 0)
                {
                    result = GetNodeByID(node, id);
                    if (result != null)
                        break;
                }
            }
            return result;
        }

        private static TreeNode GetNodeByID(TreeNode parentNode, string id)
        {
            TreeNode result = null;
            foreach (TreeNode node in parentNode.Nodes)
            {
                if (node.Tag.ToString() == id)
                {
                    result = node;
                    break;
                }

                if (node.Nodes.Count > 0)
                {
                    result = GetNodeByID(node, id);
                    if (result != null)
                        break;
                }
            }
            return result;
        }

 

//运行结果

 

转载于:https://www.cnblogs.com/Julyzjc/p/9310283.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值