C# TreeView从数据库绑定数据的示例
下面我将为你详细讲解“C# TreeView从数据库绑定数据的示例”的完整攻略。
准备工作
在演示绑定数据前,我们需要准备一些工作。首先,需要在Visual Studio中新建一个Windows Forms应用程序(这里以VS2019为例)。然后,在Solution Explorer中右键单击“References”,选择添加引用,添加System.Data和System.Data.SqlClient两个引用。最后,在Form1的设计器中拖拽一个TreeView控件和一个Button控件。
绑定数据
示例1
现在我们将从数据库中获取数据并将其绑定到TreeView控件上。示例1中我们将使用递归的方式遍历数据。
private void BindTreeView1(){ treeView1.Nodes.Clear(); //清空TreeView并初始化 string connString = "Data Source=(local);Initial Catalog=MyDB;Integrated Security=True"; using (SqlConnection conn = new SqlConnection(connString)) { string sql = "SELECT CategoryID,CategoryName,ParentID FROM Categories"; using (SqlCommand cmd = new SqlCommand(sql, conn)) { conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { int categoryId = (int)reader["CategoryID"]; string categoryName = reader["CategoryName"].ToString(); int parentId = (int)reader["ParentID"]; if (parentId == 0) //根节点 { TreeNode node = new TreeNode(categoryName); node.Tag = categoryId; treeView1.Nodes.Add(node); BindChildNode1(categoryId, node); } } reader.Close(); } }}private void BindChildNode1(int parentId, TreeNode parentNode){ string connString = "Data Source=(local);Initial Catalog=MyDB;Integrated Security=True"; using (SqlConnection conn = new SqlConnection(connString)) { string sql = "SELECT CategoryID,CategoryName,ParentID FROM Categories WHERE ParentID=" + parentId; using (SqlCommand cmd = new SqlCommand(sql, conn)) { conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { int categoryId = (int)reader["CategoryID"]; string categoryName = reader["CategoryName"].ToString(); TreeNode node = new TreeNode(categoryName); node.Tag = categoryId; parentNode.Nodes.Add(node); BindChildNode1(categoryId, node); } reader.Close(); } }}示例2
我们还可以使用DataSet和DataRelation对象,非递归的方式完成对TreeView的绑定。示例2如下:
private void BindTreeView2(){ treeView1.Nodes.Clear(); //清空TreeView并初始化 string connString = "Data Source=(local);Initial Catalog=MyDB;Integrated Security=True"; using (SqlConnection conn = new SqlConnection(connString)) { string sql = "SELECT CategoryID,CategoryName,ParentID FROM Categories"; using (SqlDataAdapter adapter = new SqlDataAdapter(sql, conn)) { DataSet ds = new DataSet(); adapter.Fill(ds, "Categories"); ds.Relations.Add("SubCategories", ds.Tables["Categories"].Columns["CategoryID"], ds.Tables["Categories"].Columns["ParentID"]); foreach (DataRow row in ds.Tables["Categories"].Rows) { if (row.IsNull("ParentID")) { TreeNode node = new TreeNode(row["CategoryName"].ToString()); node.Tag = row["CategoryID"]; treeView1.Nodes.Add(node); PopulateTreeView(row, node); } } } }}private void PopulateTreeView(DataRow dataRow, TreeNode parentNode){ DataRow[] rows = dataRow.GetChildRows("SubCategories"); foreach (DataRow row in rows) { TreeNode node = new TreeNode(row["CategoryName"].ToString()); node.Tag = row["CategoryID"]; parentNode.Nodes.Add(node); if (row.GetChildRows("SubCategories").Length > 0) { PopulateTreeView(row, node); } }}在BindTreeView2()方法中,我们先同样清空TreeView并初始化,然后查询数据库,将数据填充至DataSet中(这里只有一个表)。接着使用DataRelation对象创建子节点与父节点的关系,然后逐个查询所有的父节点(这里是没有ParentID或ParentID为null的节点),创建TreeNode对象并添加至TreeView的Nodes集合中,调用PopulateTreeView()方法。在PopulateTreeView()方法中,我们通过当前节点的CategoryID列与子节点的ParentID列建立联系,查询出所有子节点,即DataRow的子行,逐个创建TreeNode对象并添加至当前TreeNode的Nodes集合中。如果当前节点还有子节点(即该节点下还有子行),递归调用PopulateTreeView()方法。最终得到所有的TreeNode对象,全部添加到TreeView的Nodes集合中,完成整个TreeView的绑定过程。
这两个示例都是使用ADO.NET中的SqlCommand和SqlDataReader对象实现对数据库的操作。如果使用ORM框架,比如Entity Framework,数据查询和绑定都会更加容易。本文仅介绍了TreeView绑定数据的基本方法,读者可以根据自己的需求进行调整和扩展。