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


 

最终效果图

 

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

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

转载请注明出处

 

 

 

 

 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值