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