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日

相关文章

  • C#中的委托和事件

    委托和事件的概念说明: 委托是一种类型,代表可以指向具有特定参数列表和返回类型的方法的引用,可以使方法的参数自由变化,可以做到比直接调用方法更灵活。 事件是一种特殊的委托,被用于实现发布者/订阅者模式,通过事件的注册和触发可以完成对象间的通信。 委托的声明和使用: 声明委托的语法:delegate returnType DelegateName(parame…

    C# 2023年5月15日
    00
  • C++ 封装 DLL 供 C# 调用详细介绍

    C++封装DLL供C#调用是一种常见的跨语言调用方式,它的主要思想是将C++中的库函数封装成一个动态链接库(DLL),供C#或其他语言调用。下面我会详细介绍如何实现这一过程。 1. 创建一个C++动态链接库 首先,我们需要创建一个C++动态链接库项目。在Visual Studio中,可以通过File->New->Project,然后选择Win32…

    C# 2023年6月7日
    00
  • C# List实现行转列的通用方案

    针对 C# List 实现行转列的通用方案,我可以提供以下完整攻略。 1.背景 在实际项目开发过程中,经常需要处理行列互换的操作,即将代表行的数据转换为代表列的数据格式,反之亦然。这种操作在数据仓库中非常常见,例如从 Excel 或数据库中读取的数据通常是行格式,但分析和绘图会更容易处理交换后的列存储数据。C# 中提供了 List 类实现行列转换的方法,本篇…

    C# 2023年6月1日
    00
  • asp.net 读取xml文件里面的内容,绑定到dropdownlist中

    下面是详细讲解“asp.net读取xml文件里面的内容,绑定到dropdownlist中”的完整攻略。 1. 读取XML文件 我们可以使用System.Xml命名空间中的XmlDocument类来读取XML文件。首先,我们需要创建一个XmlDocument对象,并调用它的Load方法来加载XML文件。 XmlDocument xmlDoc = new Xml…

    C# 2023年5月31日
    00
  • C#中的数组用法详解

    C#中的数组用法详解 在C#中,数组是一组相同类型的数据的子集合。它是一个容器,可以存储多个具有相同类型的元素。本文将详细讲解C#中数组的用法。 创建数组 创建数组可以使用以下两种方式: 方式一:使用new关键字 使用new关键字创建数组,语法如下: 数据类型[] 数组名 = new 数据类型[数组长度]; 示例代码: int[] arr1 = new in…

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

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

    C# 2023年5月17日
    00
  • 浅谈C#下winform和JS的互相调用和传参(webbrowser)

    浅谈C#下winform和JS的互相调用和传参(webbrowser) 在C#开发中,WinForms是常见的桌面应用程序开发方式,而JavaScript(简称JS)则是Web前端开发中的基础语言,两者有时需要相互调用和传参,下面是一个完整攻略。 1.首先,在WinForms中内置了一个WebBrowser控件,可以加载HTML页面并且可以调用JavaScr…

    C# 2023年5月31日
    00
  • winform实现可拖动的自定义Label控件

    下面是实现winform可拖动自定义Label控件的攻略。 准备工作 新建winform项目,打开Visual Studio。 添加一个类库项目,用于编写自定义控件。 在类库项目中添加Winform命名空间,引用该命名空间中的控件。 编写自定义控件 在类库项目中新建一个类,继承自Label控件。 重写OnMouseDown、OnMouseMove、OnMou…

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