单表数据加载到TreeView(.Node.Level>=2) "蝴蝶效应" SelectedNode注意事项 效能优化 综合问题

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 将单表数据加载到TreeView
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        string constr = ConfigurationManager.ConnectionStrings["sql"].ConnectionString;

        #region 这是删除节点的代码
        private void btnDelete_Click(object sender, EventArgs e)
        {
            DeleteNodes(tvList.SelectedNode.Tag.ToString());
            //将当前用户选定的节点删除(含所有子节点)
            tvList.SelectedNode.Remove();
        }
        public void DeleteNodes(string id)
        {
            string sql1 = "select AreaId from TblArea where AreaPId=@PID";
            DataTable dt = this.ExecuteDataTable(sql1, new SqlParameter("@PID", id));
            foreach (DataRow item in dt.Rows)
            {
                DeleteNodes(item[0].ToString());
            }
            string sql = "delete from TblArea where AreaId=@ID";
            this.ExecuteNonQuery(sql, new SqlParameter("@ID", id));

        }
        //public DataTable ExecuteDataTable(string sql, params SqlParameter[] param)
        //{
        //    DataTable dt = new DataTable();
        //    using (SqlDataAdapter adapter = new SqlDataAdapter(sql, constr))
        //    {
        //        if (param != null)
        //        {
        //            adapter.SelectCommand.Parameters.AddRange(param);
        //        }
        //        adapter.Fill(dt);
        //    }
        //    return dt;
        //}
        public int ExecuteNonQuery(string sql, params SqlParameter[] param)
        {
            using (SqlConnection con = new SqlConnection(constr))
            {
                using (SqlCommand cmd = new SqlCommand(sql, con))
                {
                    if (param != null)
                    {
                        cmd.Parameters.AddRange(param);
                    }
                    con.Open();
                    return cmd.ExecuteNonQuery();
                }
            }
        }
        #endregion

        #region 3. 给Node添加点击事件,然后加载其子节点
        private void btnAppend_Click(object sender, EventArgs e)
        {
            //貌似这个是单击此节点的事件。事实上是上一个选中节点的事件
            //就算你初始化了某个节点 tvList.Nodes[0].Checked = true;
            //但是tvList.Nodes[0].IsSelected = false; 所以不用这个,用这个也可以:
            //加一些东西:
            tvList.NodeMouseClick += tvList_NodeMouseClick;
            //用这个:
            //tvList.AfterSelect += tvList_AfterSelect;
            ThirdDeepList(0.ToString(), tvList.Nodes);
        }

        void tvList_AfterSelect(object sender, TreeViewEventArgs e)
        {
            #region 这是追加节点的代码
            //string id = e.Node.Tag.ToString();
            //this.ThirdDeepList(id, ((TreeView)sender).SelectedNode.Nodes); 
            #endregion
        }

        void tvList_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            string id = e.Node.Tag.ToString();
            //this.ThirdDeepList(id, ((TreeView)sender).SelectedNode.Nodes);
            //加的东西
            this.ThirdDeepList(id, e.Node.Nodes);
        }

        private void ThirdDeepList(string id, TreeNodeCollection treeNodeCollection)
        {
            string sql = "select AreaId ,AreaName from TblArea where AreaPId=@PID";
            using (DataTable dt = this.ExecuteDataTable(sql, new SqlParameter("@PID", id)))
            {
                int count = dt.Rows.Count;
                if (count > 0)
                {
                    for (int i = 0; i < count; i++)
                    {
                        TreeNode tn = treeNodeCollection.Add(dt.Rows[i][1].ToString());
                        tn.Tag = dt.Rows[i][0].ToString();
                    }
                }
            }
        }

        public DataTable ExecuteDataTable(string sql, params SqlParameter[] param)
        {
            DataTable dt = new DataTable();
            using (SqlDataAdapter adapter = new SqlDataAdapter(sql, constr))
            {
                if (param != null)
                {
                    adapter.SelectCommand.Parameters.AddRange(param);
                }
                adapter.Fill(dt);
            }
            return dt;
        }
        #endregion


        //#region 2. 使用递归
        ////这样写表面上代码看起来没问题。实际上是严重的性能消耗的失败品......
        //private void btnAppend_Click(object sender, EventArgs e)
        //{
        //    SecondDeepList(0.ToString(), tvList.Nodes);
        //}
        //private void SecondDeepList(string id, TreeNodeCollection tnc)
        //{
        //    string sql = "select * from TblArea where AreaPId=@PID";
        //    using (SqlDataReader reader = this.ExecuteReader(sql, new SqlParameter("@PID", id)))
        //    {
        //        if (reader.HasRows)
        //        {
        //            while (reader.Read())
        //            {
        //                TreeNode tn = tnc.Add(reader[1].ToString());
        //                tn.Tag = reader[0].ToString();
        //                this.SecondDeepList(tn.Tag.ToString(), tn.Nodes);
        //            }
        //        }
        //    }
        //}
        //private SqlDataReader ExecuteReader(string sql, params SqlParameter[] param)
        //{
        //    SqlConnection con = new SqlConnection(constr);
        //    using (SqlCommand cmd = new SqlCommand(sql, con))
        //    {
        //        if (param != null)
        //            cmd.Parameters.AddRange(param);
        //        con.Open();
        //        return cmd.ExecuteReader(CommandBehavior.CloseConnection);
        //    }
        //}
        //#endregion

        //#region 1. 一下子全部加载到TreeView上来。不提倡,给用户感觉程序不“利索”
        //private void btnAppend_Click(object sender, EventArgs e)
        //{
        //    string sql = "select * from TblArea where AreaPId=@PID";
        //    string PID = "0";
        //    DataTable dt = this.ExecuteDataTable(sql, new SqlParameter("@PID", PID));
        //    int count = dt.Rows.Count;
        //    if (count > 0)
        //    {
        //        for (int i = 0; i < count; i++)
        //        {
        //            TreeNode tn = tvList.Nodes.Add(dt.Rows[i][1].ToString());
        //            tn.Tag = dt.Rows[i][0].ToString();
        //            this.FirstDeepList(tn.Tag.ToString(), tn);
        //        }
        //    }
        //}
        //public void FirstDeepList(string id, TreeNode tn)
        //{
        //    string sql = "select AreaId  ,AreaName from TblArea where AreaPId=@PID";
        //    string PID = id;
        //    DataTable dt = this.ExecuteDataTable(sql, new SqlParameter("@PID", id));
        //    int count = dt.Rows.Count;
        //    if (count > 0)
        //    {
        //        for (int i = 0; i < count; i++)
        //        {
        //            TreeNode newtn = tn.Nodes.Add(dt.Rows[i][1].ToString());
        //            newtn.Tag = dt.Rows[i][0].ToString();
        //            this.FirstDeepList(newtn.Tag.ToString(), newtn);
        //        }
        //    }
        //}
        //public DataTable ExecuteDataTable(string sql, params SqlParameter[] param)
        //{
        //    DataTable dt = new DataTable();
        //    using (SqlDataAdapter adapter = new SqlDataAdapter(sql, constr))
        //    {
        //        if (param != null)
        //        {
        //            adapter.SelectCommand.Parameters.AddRange(param);
        //        }
        //        adapter.Fill(dt);
        //    }
        //    return dt;
        //} 
        //#endregion
    }
}

项目数据文件:http://pan.baidu.com/s/1gd3gifL

原文地址:https://www.cnblogs.com/wjshan0808/p/3560337.html