程序员开发实例大全宝库

网站首页 > 编程文章 正文

C#从数据库中读取数据并生成TreeView树型菜单

zazugpt 2024-08-20 00:48:36 编程文章 17 ℃ 0 评论

TreeView树型菜单很好用,但如何从数据库中读取节点数据并进行绑定了,其实也很简单,通过以下几步就可以简单实现。

一、在数据库中建个表,用于保存节点名称和节点ID信息

可以在数据库中通过新建表来创建这个节点名称表,也可以通过复制下面的SQL语句直接创建表

USE [WJB]
GO
/****** 对象:  Table [dbo].[树节点]    脚本日期: 12/19/2023 21:15:46 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[树节点](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[节点名称] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
	[父节点ID] [int] NULL,
 CONSTRAINT [PK_树节点] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

新建好表以后往里面输入一些数据,我的如下图

二、新建一个winform窗口,并拖入一个TreeView控件,为了测试简单就叫TV1吧

然后开始写代码吧,需要一个DataTable

        DataTable Dt = new DataTable();
        public void LoadTree(int ParentID, TreeNode pNode)
        {
            TreeNode tn1 = new TreeNode();
            DataView dvTree = new DataView(Dt);

            dvTree.RowFilter = "[父节点ID] = " + ParentID;//过滤ParentID,得到当前的所有子节点  
            foreach (DataRowView Row in dvTree)
            {
                if (pNode == null)
                {
                    //添加根节点  
                    tn1.Text = Row["节点名称"].ToString();
                    TV1.Nodes.Add(tn1);
                    tn1.ExpandAll();
                    LoadTree(Int32.Parse(Row["ID"].ToString()), tn1);    //再次递归  
                }
                else
                {
                    //添加当前节点的子节点  
                    TreeNode tn2 = new TreeNode();
                    tn2.Text = Row["节点名称"].ToString();
                    pNode.Nodes.Add(tn2);
                    //pNode.ChildNodes.Add(tn2);
                    tn1.ExpandAll();
                    LoadTree(Int32.Parse(Row["ID"].ToString()), tn2);    //再次递归  
                }
            }
            TV1.ExpandAll();
        }
 private void Form1_Load(object sender, EventArgs e)
 {
     string sql;
     sql = "select * from 树节点";
     Dt=WJB.GetTable(sql);
     TV1.ExpandAll();

     LoadTree(0, (TreeNode)null);
 }

Dt=WJB.GetTable(sql);这个可以看前一篇文章

三、F5运行后看看结果

怎么判断你双击的节点就是最后一级的节点了,可以通过获取节点的子节点数量来判断,如果一个节点存在子节点的话那么它的子节点数量就大于0

另一个加载树型菜单的例子,使用了第三方控件,数据表的结构自己推一下吧[呲牙]

         /// <summary>
        /// 根据SQL查询出的DataTable表来加载树型菜单内容
        /// </summary>
        /// <param name="dt"></param>
        /// <param name="nodeName"></param>
        public void WriteNode(DataTable dt, string nodeName)
        {
            DataRow[] dr = dt.Select("父节点ID='" + nodeName + "'");
            int num = dr.Length;


            if (num > 0)
            {
                foreach (DataRow d in dr)
                {
                    DevComponents.AdvTree.Node n = new DevComponents.AdvTree.Node();
                    n.Name = d["节点ID"].ToString();
                    n.Text = d["节点名称"].ToString();
                    n.CheckBoxVisible = true;
                    try
                    {
                        Tree_load.FindNodeByName(nodeName).Nodes.Add(n);
                        WriteNode(dt, n.Name);
                    }
                    catch (Exception ex)
                    {

                    }

                }
            }
        }
           //在Load事件中或者你认为适合的事件中
           //加载对应的权限树信息
            Tree_load.Nodes.Clear();
            DataTable Dt = new DataTable(); ;
            string rootNodeName = "N";
            DevComponents.AdvTree.Node node = new DevComponents.AdvTree.Node();
            node.Name = rootNodeName;
            node.Text = Gs;
            Tree_load.Nodes.Add(node);

            int index = Tree_load.FindNodeByName(rootNodeName).Index;
            sql = "select 父节点ID,节点ID,节点名称 from 权限表 where 工厂代码='" + Gs_code + "'  order by id";
            Dt = hr.GetDataTable(sql);
            WriteNode(Dt, rootNodeName);
            Tree_load.ExpandAll();

好了,希望对需要的朋友有点帮助吧

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表