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();
好了,希望对需要的朋友有点帮助吧
本文暂时没有评论,来添加一个吧(●'◡'●)