TreeView

WINFORM界面如下:


本文用了2张表,结构如下:
表province: province_id    province_name
表city:         city_id    city_name   province_id

完整代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace test
{
    
public partial class TreeStruc : Form
    {
        
public TreeStruc()
        {
            InitializeComponent();
        }

        SqlConnection conn 
= new SqlConnection("server=zhuzy;integrated security=sspi;database=library");
        SqlDataAdapter da;
        DataSet ds
=new DataSet();
        SqlCommand cmd;
        
/// <summary>
        
/// 自定义节点类,继承于系统的 TreeNode 类,给节点增加一个 IsFirstExpand 属性
        
/// </summary>
        public class InheritTreeNode : TreeNode
        {
            
private bool isFirstExpand = true;

            
public bool IsFirstExpand //属性
            {
                
get { return isFirstExpand; }
                
set { isFirstExpand = value; }
            }

            
public InheritTreeNode() : base() { }
            
public InheritTreeNode(string text) : base(text) { }
        }

        
string id = "";
        
private void TreeStruc_Load(object sender, EventArgs e)
        {            
            da 
= new SqlDataAdapter("select province_id,province_name from province", conn);
            da.Fill(ds, 
"province");
            
for (int i = 0; i < ds.Tables["province"].Rows.Count; i++)
            {
                InheritTreeNode root 
= new InheritTreeNode(ds.Tables["province"].Rows[i][1].ToString().Trim());
                id 
= ds.Tables["province"].Rows[i][0].ToString().Trim();
                
this.treeView1.Nodes.Add(root);
                ReadChileNode(root);
                id 
= "";//
            }
            
this.treeView1.SelectedNode = treeView1.Nodes[0];
        }

        
/// <summary>
        
/// 读取 node 的子节点
        
/// </summary>
        private void ReadChileNode(TreeNode node)
        {
            da 
= new SqlDataAdapter("select city_name from city where province_id='" + id + "'", conn);
            da.Fill(ds, 
"city");
            
try
            {
                
for (int j = 0; j < ds.Tables["city"].Rows.Count; j++)
                {
                    node.Nodes.Add(
new InheritTreeNode(ds.Tables["city"].Rows[j][0].ToString().Trim()));
                }
            }
            
catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            ds.Tables[
"city"].Clear();//
        }

        
/// <summary>
        
/// 节点展开之前事件
        
/// </summary>
        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            InheritTreeNode node 
= (InheritTreeNode)e.Node;//获取要选中、展开、折叠或选择的树节点e.Node

            
if (node != null)
            {
                
// 判断该节点是否首次被展开
                if (node.IsFirstExpand)
                {
                    
for (int i = 0; i < node.Nodes.Count; i++)
                    {
                        ReadChileNode(node.Nodes[i]); 
//为 e.Node 下的每个子节点,添加子节点
                    }
                }
            }
            node.IsFirstExpand 
= false;
        }
        
        
/// <summary>
        
/// 将文本框输入的内容添加为父节点
        
/// </summary>
        private void btnAddParentNode_Click(object sender, EventArgs e)
        {
            
try
            {
                
string strParentNode = this.textBox1.Text.ToString().Trim();
                da 
= new SqlDataAdapter("select province_name from province where province_name='" + strParentNode + "'", conn);
                da.Fill(ds, 
"province_name");
                
int nCount = ds.Tables["province_name"].Rows.Count;
                
if (textBox1.Text.ToString().Trim() != "")
                {
                    
if (nCount == 0//判断是否存在重复省份
                    {
                        da 
= new SqlDataAdapter("select max(province_id) from province", conn);
                        da.Fill(ds, 
"id");

                        
string _max_province_id = ds.Tables["id"].Rows[0][0].ToString().Trim();
                        
int nID = Convert.ToInt32(_max_province_id) + 1;
                        
string strID = "00" + nID.ToString().Trim();

                        
string _insertSQL = "insert into province values('" + strID + "','" + strParentNode + "')";
                        cmd 
= new SqlCommand(_insertSQL, conn);
                        conn.Open();
                        cmd.ExecuteNonQuery();
                        conn.Close();

                        
this.treeView1.Nodes.Add(strParentNode); //使新增的节点在TreeView里显示
                        textBox1.Clear();
                        textBox1.Focus();
                    }
                    
else
                    {
                        MessageBox.Show(
"当前新增的省份已经存在,请重新输入!""提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        textBox1.Clear();
                        textBox1.Focus();
                    }
                }
            }
            
catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        
/// <summary>
        
/// 在选择了父节点后,将文本框中的内容添加为其子节点
        
/// </summary>
        string str_insert_province_id = "";
        
string str_insert_city_id = "";
        
private void btnAddChildNode_Click(object sender, EventArgs e)
        {
            
try
            {
                TreeNode node 
= this.treeView1.SelectedNode;
                
string strProvinceName = node.Text;
                
if (node != null)
                {
                    retunParentNode_ID(strProvinceName);
                    insertChildNode(node);
                    textBox1.Clear();
                    textBox1.Focus();
                }
                
else
                {
                    MessageBox.Show(
"请先选择需要新增城市信息的省份!""提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    textBox1.Clear();
                    textBox1.Focus();
                }
            }
            
catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
       }

        
/// <summary>
        
/// 返回当前选择的父节点的province_id
        
/// </summary>
        
/// <returns></returns>
        private string retunParentNode_ID(string strName)
        {
            da 
= new SqlDataAdapter("select province_id from province where province_name='" + strName + "'", conn);
            da.Fill(ds, 
"province_id");
            str_insert_province_id 
= ds.Tables["province_id"].Rows[0][0].ToString().Trim();//即将新增的子节点的province_id
            return str_insert_province_id;
        }
        
/// <summary>
        
/// 在当前选择的父节点下新增子节点
        
/// </summary>
        private void insertChildNode(TreeNode CurrentParentNode)
        {
            
string strChildNode = this.textBox1.Text.ToString().Trim();
            
try
            {
                
if (textBox1.Text.ToString().Trim() != "")
                {
                    
string strsql = "select * from city where province_id='" + str_insert_province_id + "'";
                    da 
= new SqlDataAdapter(strsql, conn);
                    da.Fill(ds, 
"tb");
                    
int nCount1 = ds.Tables["tb"].Rows.Count;
                    
if (nCount1 == 0//父节点下没有子节点
                    {
                        
string _city_id = "0" + "1";
                        
string _insertSQL = "insert into city values('" + _city_id + "','" + strChildNode + "','" + str_insert_province_id + "')";

                        cmd 
= new SqlCommand(_insertSQL, conn);
                        conn.Open();
                        cmd.ExecuteNonQuery();
                        conn.Close();

                        CurrentParentNode.Nodes.Add(strChildNode);
                        textBox1.Clear();
                        textBox1.Focus();
                    }
                    
if (nCount1 != 0//父节点下有子节点
                    {
                        da 
= new SqlDataAdapter("select city_name from city where city_name='" + strChildNode + "'", conn);
                        da.Fill(ds, 
"city_name");
                        
int nCount2 = ds.Tables["city_name"].Rows.Count;
                        
if (nCount2 == 0//不存在相同的子节点
                        {
                            
string _max_city_id = "select max(city_id) from city where province_id='" + str_insert_province_id + "'";
                            da 
= new SqlDataAdapter(_max_city_id, conn);
                            da.Fill(ds, 
"city_id");
                            str_insert_city_id 
= ds.Tables["city_id"].Rows[0][0].ToString().Trim();
                            
int nID = Convert.ToInt32(str_insert_city_id) + 1;
                            str_insert_city_id 
= "0" + nID.ToString().Trim();

                            
string _insertSQL = "insert into city values('" + str_insert_city_id + "','" + strChildNode + "','" + str_insert_province_id + "')";

                            cmd 
= new SqlCommand(_insertSQL, conn);
                            conn.Open();
                            cmd.ExecuteNonQuery();
                            conn.Close();

                            CurrentParentNode.Nodes.Add(strChildNode);
                            textBox1.Clear();
                            textBox1.Focus();
                        }
                        
if (nCount2 != 0//存在相同的子节点
                        {
                            MessageBox.Show(
"已经存在此城市,请重新输入!""提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            textBox1.Clear();
                            textBox1.Focus();
                        }
                    }
                }
            }
            
catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
}

备注:此树只实现2层结构
原文地址:https://www.cnblogs.com/perfect/p/606316.html