zoukankan      html  css  js  c++  java
  • 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层结构
  • 相关阅读:
    BackgroundWorker原理剖析
    委托异步调用时BeginInvoke的陷阱处理
    线程静态在对象缓存中的妙用
    值得珍藏的.NET源码,不保存就没机会了
    .NET 4.5.1 参考源码索引
    .NET 4.5 参考源码索引
    .NET 4.0 参考源码索引
    WWF3.5SP1 参考源码索引
    WCF3.5 SP1 参考源码索引
    .NET 3.5.1 参考源码索引
  • 原文地址:https://www.cnblogs.com/perfect/p/606316.html
Copyright © 2011-2022 走看看