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();
        }
    }
}

以上是使用递归方式绑定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技术站

(0)
上一篇 2023年6月2日
下一篇 2023年6月2日

相关文章

  • .NET 纯分页代码实例

    下面是对“.NET 纯分页代码实例”的完整攻略。 理解分页 在了解分页代码实例之前,首先要理解分页是什么。在网站或者应用中,当数据量太大时,我们需要对其进行分页展示,将数据按照页码分组,方便查看和管理。分页展示涉及到页面布局、URL 地址、数据读取等多种技术,需要综合使用。 实现分页代码 使用PagedList.Mvc插件实现分页 PagedList.Mvc…

    C# 2023年5月31日
    00
  • C# File.CreateText(string path):创建指定文件,并返回StreamWriter对象

    C#的File类提供了一系列文件操作的静态方法。其中,CreateText(string path)方法用于创建或覆盖现有文件并向其写入文本内容。下面是其详细的使用方法: 方法签名 public static StreamWriter CreateText(string path); 参数说明 参数名 类型 说明 path string 要创建的文件的完整路…

    C# 2023年4月19日
    00
  • 详解在ASP.NET Core中如何编写合格的中间件

    详解在ASP.NET Core中如何编写合格的中间件 在ASP.NET Core中,中间件是一种用于处理HTTP请求和响应的组件。中间件可以执行各种任务,例如记录请求、验证身份、缓存响应等。在本攻略中,我们将详细讲解如何编写合格的中间件,并提供两个示例说明。 步骤一:创建中间件 在ASP.NET Core中创建中间件,您需要创建一个类,并实现IMiddlew…

    C# 2023年5月17日
    00
  • 浅谈C#中对引用类型的误解

    以下是浅谈C#中对引用类型的误解的完整攻略: 引言 在C#中,我们通常会面对值类型和引用类型两种不同类型的数据。引用类型在代码中使用得非常广泛,但是对于一些新手开发者来说,他们可能会对引用类型有一些误解,比如认为引用类型是深拷贝,或者不用关心内存等问题。本文将介绍这些误解,并分享一些关于引用类型的实用技巧。 误解一:认为引用类型是深拷贝 在C#中,引用类型存…

    C# 2023年6月7日
    00
  • C# 将数据库SqlServer数据绑定到类中的过程详解

    标题 C# 将数据库 SqlServer 数据绑定到类中的过程详解 简介 本篇攻略主要介绍 C# 中如何将数据库 SqlServer 数据绑定到类中,从而方便数据操作和管理。 过程分析 3.1 使用 DataSet 进行绑定 在 C# 中,使用 DataSet 对象可以将数据库中的数据绑定到类中。具体操作步骤如下: (1)建立 C# 项目,并在项目中添加 S…

    C# 2023年6月2日
    00
  • C#实现简单的窗口抖动

    C#实现简单的窗口抖动攻略 本文将介绍如何用C#语言实现简单的窗口抖动效果。用于提示用户操作错误等情况,增加用户的交互体验。 原理说明 窗口抖动的原理是通过快速切换窗口的位置来实现,具体做法是: 获取当前窗口的位置信息 在原位置上左右、上下抖动一定的距离 还原窗口至原位置 循环完成上述过程 实现过程 1. 获取当前窗口位置信息 在Form类的成员方法中,可以…

    C# 2023年6月6日
    00
  • 如何给C#变量取名字

    给C#变量取名字的过程中,需要遵循一些规则和最佳实践,以确保代码易读、易理解和易于维护。下面是如何给C#变量取名字的完整攻略: 命名规则 变量名由字母、数字和下划线组成,必须以字母或下划线开头,不能以数字开头; 变量名大小写敏感; 变量名不可以使用关键字或保留字,如int、double等; 变量名应该具有描述性,并遵循驼峰命名法(Camel Case),即第…

    C# 2023年6月6日
    00
  • C# javascript 读写Cookie的方法

    C# JavaScript 读写 Cookie 的方法 在 Web 开发中,Cookie 是常用的数据存储方式。Cookie 可以在浏览器端或服务器端创建,存储在用户浏览器的 Cookie 文件中,以便下一次访问同一站点时能够获得 Cookie。 本文将详细介绍 C# 和 JavaScript 读写 Cookie 的方法,并提供两个示例说明。 C# 读写 C…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部