C# TreeView从数据库绑定数据的示例

yizhihongxing

下面我将为你详细讲解“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日

相关文章

  • VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解 在开发过程中,我们往往需要将自己开发的程序打包部署,让其他人可以方便地安装和使用我们的程序。本攻略将介绍如何使用 VS2012 打包部署程序。下面将详细讲述打包部署程序的步骤。 1.在 Visual Studio 中创建安装程序项目 打开 Visual Studio,点击“文件”–>“新建”–>“项目”,在…

    C# 2023年6月3日
    00
  • C# String.Join()方法: 将一个字符串数组的所有元素连接成一个字符串

    C#中的String类拥有Join()方法,它是用来连接字符串数组中的所有元素,返回一个新的字符串。下面是该函数的定义和使用方法: string.Join(string separator, params object[] values) 其中,参数separator是一个字符串,用于分割数组中的元素;参数values是object类型的数组,表示被连接的字…

    C# 2023年4月19日
    00
  • C# PictureBox图片控件实现图片交换

    下面是“C# PictureBox图片控件实现图片交换”的完整攻略: 简介 在.NET Windows Forms应用程序中,PictureBox控件是一个常用的控件,用于显示图像并对其进行操作。其中,图片交换是一个常见的操作,本文将从以下几个方面介绍如何使用PictureBox控件实现图片交换: PictureBox控件的基本使用; 从本地文件读取图片并显…

    C# 2023年5月31日
    00
  • C#语法相比其它语言比较独特的地方(二)

    下面我将详细讲解“C#语法相比其它语言比较独特的地方(二)”的攻略: 1. 运算符重载 在C#中,我们可以重载运算符来自定义类型之间的运算操作。这就是C#语法相比其它语言比较独特的地方之一。 例如,我们可以定义一个Rational类(代表有理数),并重载运算符以便让我们像操作整数一样操作有理数。 class Rational { public int Num…

    C# 2023年5月31日
    00
  • WinForm导出文件为Word、Excel、文本文件的方法

    WinForm是一种典型的Windows桌面应用程序开发技术,它提供了丰富的界面控件和处理逻辑的能力。在WinForm应用中,我们需要经常使用到文件导出功能,常见的导出格式包括Word文档、Excel文档以及文本文件。本篇攻略将详细介绍WinForm导出文件为Word、Excel、文本文件的方法,并提供两个示例说明。 1. 导出Word文档 1.1 安装并引…

    C# 2023年6月1日
    00
  • C# 递归算法详解

    C# 递归算法详解 什么是递归算法? 递归算法是一种基于函数调用的算法,它通过函数不断地调用自身来解决问题。在使用递归算法时,程序会将问题分解为更小的子问题,并不断递归地调用函数来解决这些子问题。递归算法适用于解决需要重复进行相同操作的问题,例如对某个数据结构进行遍历,或者对某段数据进行处理。 递归算法的应用场景 递归算法广泛应用于以下场景: 数据结构的遍历…

    C# 2023年6月6日
    00
  • C# wpf解决Popup弹出位置异常问题解决

    在WPF中,我们可以通过Popup弹出一个窗口,但是由于窗口的弹出位置可能会和我们期望的不一样,而且有时候在某些屏幕分辨率下表现得更为明显。在这种情况下,我们需要进行调整以确保Popup窗口出现在我们期望的位置。下面是解决这个问题的方法: 1. 设置PlacementMode属性 在Popup控件中,可以通过设置PlacementMode属性来控制Popup…

    C# 2023年6月6日
    00
  • C# 如何规范的写 DEBUG 输出

    当我们在开发 C# 项目时,使用调试输出信息是非常重要的一个环节,它可以帮助我们调试代码,发现问题和错误。但是,在使用 DEBUG 输出信息时,我们也需要注意规范的写法,以免给项目的后续维护发布带来问题。 下面,让我们来详细讲解C#如何规范的写DEBUG输出的完整攻略。 1. 为 DEBUG 输出选择适当的方法 在 C# 中,有多种选择可供 DEBUG 输出…

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