Winfrom开发之经过treeview实现树形结构
Winfrom开发之通过treeview实现树形结构
Winfrom开发之通过treeview实现树形结构
方法一、 节点法
分析 节点法类似于树形结构中的树,通过父节点和子节点 以及节点深度来查找
根节点没有父节点 深度为0
部门与所属子部门的深度差为1,
子部门的父节点是上级部门的主键
例如市场部的父节点为1 节点深度为0
数据库设计如图所示
测试数据
使用的控件
实现代码
//初始化树 private void InitTree() { using ( SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=company;Integrated Security=True")) { if (con.State != ConnectionState.Open) { con.Close(); con.Open(); } SqlCommand cmd = con.CreateCommand(); cmd.CommandText = @" Select dname from dparttree where deepth =0 ";//查询根节点 SqlDataReader sdr = cmd.ExecuteReader(); while (sdr.Read()) { TreeNode tchild = new TreeNode(); tchild.Text = sdr["dname"].ToString(); LoadAll(sdr["dname"].ToString(), tchild); this.treeView1.Nodes.Add(tchild);//把根节点加入到treeview的根节点 } } } //加载所属节点 public void LoadAll(string departName, TreeNode tn) { //连接数据库 using ( SqlConnection conn = new SqlConnection("Data Source=.; Initial Catalog=company;User ID=sa;Password=123")) { if (conn.State != ConnectionState.Open) { conn.Close(); conn.Open(); } SqlCommand cmd = conn.CreateCommand(); //查询语句 根据部门名称查询当前部门的部门id cmd.CommandText = @" Select dname From dparttree where dparentid in (Select did From dparttree where dname='" + departName + "')"; SqlDataReader sdr = cmd.ExecuteReader(); while (sdr.Read()) { TreeNode tchild = new TreeNode(); //初始化一个节点 tchild.Name = sdr["dname"].ToString();//给节点名赋值 tchild.Text = sdr["dname"].ToString();//给节点文本赋值 LoadAll(sdr["dname"].ToString(), tchild);//递归调用加载所属节点方法 tn.Nodes.Add(tchild);//把当前节点加入到tn数的节点中 } } }
方法2 前缀法
总公司是1
下属公司是技术部11,商务部12
技术部下属前端组111,代码组112,实施组113
查询时根据前缀来辨别所属部门
实现代码
//初始化树 private void InitTree2() { using ( SqlConnection conn = new SqlConnection("Data Source=.; Initial Catalog=company;User ID=sa;Password=123")) { if (conn.State != ConnectionState.Open) { conn.Close(); conn.Open(); } SqlCommand cmd = conn.CreateCommand(); cmd.CommandText = @" Select * From T_depart where departid like '1'" ; SqlDataReader sdr = cmd.ExecuteReader(); while (sdr.Read()) { TreeNode tchild = new TreeNode(); tchild.Name = sdr["departid"].ToString(); tchild.Text = sdr["departname"].ToString(); LoadAll2(sdr["departid"].ToString(), tchild); this.treeView2.Nodes.Add(tchild); } } } //加载所属节点 public void LoadAll2(string departid, TreeNode tn) { using ( SqlConnection conn = new SqlConnection("Data Source=.; Initial Catalog=company;User ID=sa;Password=123")) { if (conn.State != ConnectionState.Open) { conn.Close(); conn.Open(); } SqlCommand cmd = conn.CreateCommand(); //限定查询位数 如果部门很多 需要2位 那么就需要2个占位符(下划线) departid = departid + "_"; //通过通配符查询 cmd.CommandText =@" Select * From T_depart where departid like '" + departid+"'"; SqlDataReader sdr = cmd.ExecuteReader(); while (sdr.Read()) { TreeNode tchild = new TreeNode(); tchild.Name = sdr["departid"].ToString(); tchild.Text = sdr["departname"].ToString(); LoadAll2(sdr["departid"].ToString(), tchild);//递归调用加载所属节点方法 tn.Nodes.Add(tchild);//把当前节点加入到tn数的节点中 } } }
在窗体加载方法中调用2个初始化方法
public TreeDemo() { InitializeComponent(); InitTree();//方法一 InitTree2();//方法二 }
最终效果图
本博是小黄瓜要编程在学习工作中的随笔, 在帮助自己学习和记忆的同时,供给有需要的朋友学习
存在着许多不足,喜欢大家指出交流,共同学习进步
转载请注明出处
版权声明:本文为博主原创文章,未经博主允许不得转载。