您的位置:首页 > 其它

Winfrom开发之通过treeview实现树形结构

2015-07-01 20:00 537 查看

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();//方法二
}


 

最终效果图



 

本博是小黄瓜要编程在学习工作中的随笔, 在帮助自己学习和记忆的同时,供给有需要的朋友学习

存在着许多不足,喜欢大家指出交流,共同学习进步

转载请注明出处

 

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: