zoukankan      html  css  js  c++  java
  • 单表数据加载到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

  • 相关阅读:
    Union用法及说明:
    SQL用了Union后的排序问题
    10条PHP编程习惯助你找工作
    PHP性能分析工具xhprof的安装使用与注意事项
    11款数据分析工具(附体验网址)
    Linux下的库操作工具-nm、ar、ldd、ldconfig和ld.so
    ldd显示可执行模块的dependenc
    计算机图形学,三维框架设计
    dnat,snat
    百度识图API
  • 原文地址:https://www.cnblogs.com/wjshan0808/p/3560337.html
Copyright © 2011-2022 走看看