下面我将为你详细讲解“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();
}
}
}
以上是使用递归方式绑定TreeView的示例。在BindTreeView1()方法中,我们首先清空TreeView并初始化,在数据库中查询出所有的父节点(ParentID=0)并为其创建一个TreeNode对象,添加到TreeView的Nodes集合中。然后再调用递归方法BindChildNode1(),传递该节点的ID和TreeNode对象。在BindChildNode1()方法中,查询所有子节点(即ParentID等于传入ID的节点),创建TreeNode对象,添加到传入的TreeNode的Nodes集合中,再递归查询该子节点下的所有子节点。最终得到所有的TreeNode对象,全部添加到TreeView的Nodes集合中,完成整个TreeView的绑定过程。
示例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绑定数据的基本方法,读者可以根据自己的需求进行调整和扩展。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# TreeView从数据库绑定数据的示例 - Python技术站