知识问答

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绑定数据的基本方法,读者可以根据自己的需求进行调整和扩展。