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
单表数据加载到TreeView(.Node.Level>=2) "蝴蝶效应" SelectedNode注意事项 效能优化 综合问题
原文:http://www.cnblogs.com/wjshan0808/p/3560337.html