如何添加資料庫中的資訊加載到樹形控件中?如何周遊控件中的資訊?如何對控件中的資訊進行增删查改?
資料庫設計:

主界面:
代碼:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using TreeSolution.BLL;
using TreeSolution.Model;
namespace 樹型測試
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//當窗體加載時,加載樹形節點
private void Form1_Load(object sender, EventArgs e)
T_TreeBLL treeBLL = new T_TreeBLL();
IEnumerable<T_Tree> tree = treeBLL.GetByParentId(0);
foreach (T_Tree node in tree)
{
TreeNode treeNode = new TreeNode();
treeNode.Text = node.Name;
treeNode.Tag = node;//将每一個節點所對應的model都放到它的Tag上
treeView1.Nodes.Add(treeNode);
FillChildren(treeNode,(int)node.Id);
}
/// <summary>
/// 把以parentId為父節點的節點都添加到parentNode下
/// </summary>
/// <param name="pareNode">父節點</param>
/// <param name="parentId"></param>
private void FillChildren(TreeNode pareNode, int parentId)
IEnumerable<T_Tree> tree = treeBLL.GetByParentId(parentId);
pareNode.Nodes.Add(treeNode);
//把所有的以我parentid的都加載到我的下面
FillChildren(treeNode, (int)node.Id);
//點選目前節點,顯示他的文字
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
string s = e.Node.Text.ToString();
MessageBox.Show(s);
//周遊節點
#region 周遊節點
private void button1_Click(object sender, EventArgs e)
foreach (TreeNode node in treeView1.Nodes)
DisplayNode(node);
//遞歸調用的節點
private void DisplayNode(TreeNode node)
textBox1.AppendText(node.Text + "\r\n");
if (node.Nodes.Count > 0)
foreach (TreeNode childNode in node.Nodes)
{
DisplayNode(childNode);
}
#endregion
/// 修改節點
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
T_Tree model = (T_Tree)treeView1.SelectedNode.Tag;
EditNode form = new EditNode();
form.NodeName = model.Name;
form.NodeBody = model.Body;
if (form.ShowDialog() == DialogResult.OK)
model.Name = form.NodeName;
model.Body = form.NodeBody;
new T_TreeBLL().Update(model);
/// <summary>
/// 添加根節點
private void btnAddRootNode_Click(object sender, EventArgs e)
if (form.ShowDialog()!=DialogResult.OK)
return;
T_Tree model = new T_Tree();
model.Name = form.NodeName;
model.Body = form.NodeBody;
model.ParentId = 0;
//添加資訊并傳回新添加的Id
int id=new T_TreeBLL().AddNew(model);
//将新增的Id賦給對象
model.Id = id;
//添加節點到Treeview控件上
TreeNode node=new TreeNode();
node.Text=model.Name;
node.Tag = model;
treeView1.Nodes.Add(node);
//增加子節點
private void btnAddChildNode_Click(object sender, EventArgs e)
TreeNode selectedNode = treeView1.SelectedNode;
if (selectedNode == null)
MessageBox.Show("沒有節點被選中");
//獲得選中節點的(父節點的)模型對象
T_Tree parentModel=(T_Tree)selectedNode.Tag;
//EditNode form = new EditNode();
model.ParentId = parentModel.Id;
model.Id=new T_TreeBLL().AddNew(model);
//添加節點
TreeNode treeNode = new TreeNode();
treeNode.Text = model.Name;
treeNode.Tag = model;
selectedNode.Nodes.Add(treeNode);
//删除節點
private void btnDelete_Click(object sender, EventArgs e)
//選中節點
selectedNode.Remove();
T_Tree model = (T_Tree)selectedNode.Tag;
new T_TreeBLL().DeleteAllNode((int)model.Id);
}
}
修改界面:
public partial class EditNode : Form
public EditNode()
public string NodeName
get { return txtName.Text; }
set { txtName.Text = value; }
public string NodeBody
get { return txtBody.Text; }
set { txtBody.Text = value; }
DialogResult = DialogResult.OK;
DialogResult = DialogResult.Cancel;
總圖:
sqlhelper:
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
namespace TreeSolution.DAL
class SqlHelper
public static readonly string connstr =
ConfigurationManager.ConnectionStrings["dbconnstr"].ConnectionString;
public static int ExecuteNonQuery(string cmdText,
params SqlParameter[] parameters)
using (SqlConnection conn = new SqlConnection(connstr))
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
cmd.CommandText = cmdText;
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteNonQuery();
public static object ExecuteScalar(string cmdText,
return cmd.ExecuteScalar();
public static DataTable ExecuteDataTable(string cmdText,
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}
public static SqlDataReader ExecuteDataReader(string cmdText,
SqlConnection conn = new SqlConnection(connstr);
conn.Open();
using (SqlCommand cmd = conn.CreateCommand())
cmd.CommandText = cmdText;
cmd.Parameters.AddRange(parameters);
return cmd.ExecuteReader(CommandBehavior.CloseConnection);
三層模型的代碼:
model:
namespace TreeSolution.Model
partial class T_Tree
public System.Int32? Id { get; set; }
public System.Int32? ParentId { get; set; }
public System.String Name { get; set; }
public System.String Body { get; set; }
DAL:
partial class T_TreeDAL
/// 添加資料
/// <param name="model">資料模型</param>
/// <returns></returns>
public int AddNew(T_Tree model)
string sql = "insert into T_Tree(ParentId,Name,Body) output inserted.id values(@ParentId,@Name,@Body)";
int id = (int)SqlHelper.ExecuteScalar(sql
, new SqlParameter("ParentId", model.ParentId)
, new SqlParameter("Name", model.Name)
, new SqlParameter("Body", model.Body)
);
return id;
/// 更新資料
/// <param name="model">一個資料模型</param>
public bool Update(T_Tree model)
int rows = SqlHelper.ExecuteNonQuery(sql
,new SqlParameter("Id", model.Id)
,new SqlParameter("ParentId", model.ParentId)
,new SqlParameter("Name", model.Name)
,new SqlParameter("Body", model.Body)
return rows > 0;
/// 删除某一節點
/// <param name="id">id号</param>
public bool Delete(int id)
new SqlParameter("id",id));
/// 将一行資料轉化為model
/// <param name="row"></param>
private static T_Tree ToModel(DataRow row)
model.Id = row.IsNull("Id")?null:(System.Int32?)row["Id"];
model.ParentId = row.IsNull("ParentId")?null:(System.Int32?)row["ParentId"];
model.Name = row.IsNull("Name")?null:(System.String)row["Name"];
model.Body = row.IsNull("Body")?null:(System.String)row["Body"];
return model;
/// 獲得Id為多少的對象
/// <param name="id"></param>
public T_Tree Get(int id)
if (dt.Rows.Count > 1)
{throw new Exception("more than 1 row was found");}
if (dt.Rows.Count <= 0){return null;}
DataRow row = dt.Rows[0];
T_Tree model = ToModel(row);
/// 獲得幾級節點
/// <returns>傳回集合</returns>
public IEnumerable<T_Tree> GetByParentId(int id)
List<T_Tree> list = new List<T_Tree>();
new SqlParameter("parentid", id));
foreach (DataRow row in dt.Rows)
list.Add(ToModel(row));
return list;
/// 傳回所有的T_Tree對象
/// <returns>傳回T_Tree對象的泛型集合(隻讀屬性)</returns>
public IEnumerable<T_Tree> ListAll()
DataTable dt = SqlHelper.ExecuteDataTable("select * from T_Tree");
foreach (DataRow row in dt.Rows){
//删除目前節點的所有子節點
public void DeleteAllNode(int id)
IEnumerable<T_Tree> children = GetByParentId(id);
foreach (T_Tree model in children)
DeleteAllNode((int)model.Id);
Delete(id);
BLL:
using TreeSolution.DAL;
namespace TreeSolution.BLL
partial class T_TreeBLL
/// <param name="model"></param>
return new T_TreeDAL().AddNew(model);
/// 删除資料
return new T_TreeDAL().Delete(id);
return new T_TreeDAL().Update(model);
/// 查詢某一Id的資料
return new T_TreeDAL().Get(id);
/// 傳回集合
return new T_TreeDAL().GetByParentId(id);
/// 查詢所有的資料
return new T_TreeDAL().ListAll();
/// <summary>
/// 删除所有節點
new T_TreeDAL().DeleteAllNode(id);
}