C# TreeView读取数据库简单实例

C# TreeView读取数据库简单实例

本文将介绍如何在C#的WinForms应用程序中,使用TreeView控件读取数据库数据,并在TreeView节点中展示出来。我们以展示行政区划(省市县)为例子。

确定数据库

我们首先要确定用于存放数据的数据库。在本例中,我们使用MySQL数据库。

创建数据库

我们需要先创建一个数据库,并在其中创建一个表结构,用于存储行政区划数据。表结构如下:

CREATE TABLE `region` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `parent_id` int(11) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

表结构中包含了三个字段,id代表节点ID,name代表节点名称,parent_id代表节点的父节点ID。

插入数据

我们插入一些测试数据来演示如何读取数据并展示在TreeView中。示例数据如下:

INSERT INTO `region`(`id`, `name`, `parent_id`) VALUES
(1, '北京市', 0),
(2, '天津市', 0),
(3, '河北省', 0),
(4, '内蒙古自治区', 0),
(101, '海淀区', 1),
(102, '丰台区', 1),
(103, '石景山区', 1),
(104, '西城区', 1),
(201, '和平区', 2),
(202, '河东区', 2),
(203, '河西区', 2),
(204, '南开区', 2),
(301, '石家庄市', 3),
(302, '唐山市', 3),
(303, '保定市', 3),
(304, '邢台市', 3),
(401, '呼和浩特市', 4),
(402, '包头市', 4),
(403, '赤峰市', 4),
(404, '呼伦贝尔市', 4);

创建WinForms应用程序

我们使用Visual Studio创建一个WinForms应用程序,并添加TreeView控件。

安装MySQL.Data依赖库

在使用MySQL数据库前,我们需要安装MySQL.Data依赖库。在Visual Studio中打开工具->NuGet包管理器->程序包管理器控制台,输入以下命令安装MySQL.Data:

Install-Package MySql.Data

读取数据并展示在TreeView中

下面是示例代码,用于读取行政区划数据并展示在TreeView中。

using System;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace TreeViewExample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            LoadTreeView();
        }

        private void LoadTreeView()
        {
            treeView1.Nodes.Clear();
            string connectionString = "server=localhost;user id=root;password=123456;database=test;";
            MySqlConnection connection = new MySqlConnection(connectionString);
            MySqlCommand command = new MySqlCommand("SELECT * FROM `region`", connection);

            try
            {
                connection.Open();
                MySqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    int id = reader.GetInt32("id");
                    string name = reader.GetString("name");
                    int parentId = reader.GetInt32("parent_id");
                    TreeNode parentNode = FindNodeById(parentId);
                    if (parentNode != null)
                    {
                        parentNode.Nodes.Add(id.ToString(), name);
                    }
                    else
                    {
                        treeView1.Nodes.Add(id.ToString(), name);
                    }
                }

                reader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                connection.Close();
            }
        }

        private TreeNode FindNodeById(int id)
        {
            return treeView1.Nodes.Find(id.ToString(), true)[0];
        }
    }
}

该代码主要实现以下功能:

  1. 连接数据库;
  2. 执行查询,读取每一行的数据;
  3. 根据数据中的父节点ID,找到父节点的TreeNode对象;
  4. 将该节点添加到父节点中或treeView1.Nodes中。

以上示例代码演示了如何读取一张表的数据,不妨思考一下,如果我们需要读取多张表的各种关系数据并在TreeView中展示出来,我们要怎么办呢?

下面是一个扩展示例,演示了如何读取多张表的多层级数据,并展示在TreeView中。假设我们有teacher、class和student三张表,其中teacher表没有父节点,class表的父节点是teacher表中的一条记录,student表的父节点是class表中的一条记录。对应的数据库表结构如下:

CREATE TABLE `teacher` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

CREATE TABLE `class` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `teacher_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `teacher_id` (`teacher_id`),
  CONSTRAINT `class_ibfk_1` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `student` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `class_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `class_id` (`class_id`),
  CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

以下是示例代码:

using System;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace TreeViewExample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            LoadTreeView();
        }

        private void LoadTreeView()
        {
            treeView1.Nodes.Clear();
            string connectionString = "server=localhost;user id=root;password=123456;database=test;";
            MySqlConnection connection = new MySqlConnection(connectionString);
            MySqlCommand command = new MySqlCommand(@"
                SELECT 
                    `teacher`.`id` AS `teacher_id`,
                    `teacher`.`name` AS `teacher_name`,
                    `class`.`id` AS `class_id`,
                    `class`.`name` AS `class_name`,
                    `student`.`id` AS `student_id`,
                    `student`.`name` AS `student_name`
                FROM `teacher`
                JOIN `class` ON `teacher`.`id` = `class`.`teacher_id`
                JOIN `student` ON `class`.`id` = `student`.`class_id`
            ", connection);

            try
            {
                connection.Open();
                MySqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    int teacherId = reader.GetInt32("teacher_id");
                    string teacherName = reader.GetString("teacher_name");
                    int classId = reader.GetInt32("class_id");
                    string className = reader.GetString("class_name");
                    int studentId = reader.GetInt32("student_id");
                    string studentName = reader.GetString("student_name");

                    TreeNode teacherNode = FindNodeById(teacherId);
                    if (teacherNode == null)
                    {
                        teacherNode = treeView1.Nodes.Add(teacherId.ToString(), teacherName);
                    }

                    TreeNode classNode = FindNodeById(classId);
                    if (classNode == null)
                    {
                        classNode = teacherNode.Nodes.Add(classId.ToString(), className);
                    }

                    TreeNode studentNode = FindNodeById(studentId);
                    if (studentNode == null)
                    {
                        studentNode = classNode.Nodes.Add(studentId.ToString(), studentName);
                    }
                }

                reader.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                connection.Close();
            }
        }

        private TreeNode FindNodeById(int id)
        {
            return treeView1.Nodes.Find(id.ToString(), true).Length > 0 ? treeView1.Nodes.Find(id.ToString(), true)[0] : null;
        }
    }
}

注意,该示例中的SELECT语句,对于每一行数据,都包括了对应的teacher、class和student的全部字段信息。在代码中,我们首先读取出每个节点的ID和名称,然后根据关系,查找父节点的TreeNode对象,创建并添加该节点。

以上示例代码仅为参考,实际的场景中还需要根据需求进行适当的调整。

总结

本文介绍了如何使用C#中的TreeView控件读取MySQL数据库数据,并将数据展示在TreeView节点中。我们演示了两个示例,第一个展示了单表数据读取,第二个展示了多张表数据读取,希望可以帮助到读者。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# TreeView读取数据库简单实例 - Python技术站

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

相关文章

  • C#中的委托Delegate

    当我们需要在程序运行时动态指定一个方法时,委托(Delegate)是一个非常方便的工具。C#的委托类似于Java或C++中的函数指针,它可以指向一个或一组指定方法的引用。委托可以用来封装函数,以便在其他函数中调用此函数。 委托的定义 在C#中,使用delegate关键字来定义委托类型。委托类型实质上是一种类,它包含指向方法的引用。定义语法如下: access…

    C# 2023年6月7日
    00
  • C#实现老板键功能的代码

    当我们在使用电脑的时候,有时会有别人突然进入房间或者需要临时离开,这个时候我们需要有一个快捷的方式来隐藏当前程序或窗口,以避免别人看到我们的操作内容,这就是所谓的“老板键功能”。下面我来为大家介绍如何使用C#来实现老板键功能的代码。 1. 原理 老板键功能的实现原理是通过监听操作系统的键盘事件,当监听到我们设定的快捷键时,就会触发我们的代码来执行指定的操作,…

    C# 2023年5月31日
    00
  • LINQ教程之LINQ操作语法

    欢迎来到本站的LINQ教程,今天我们将学习LINQ操作语法,帮助您更好地理解和使用LINQ。 什么是LINQ操作语法 LINQ操作语法(LINQ Query Syntax)是一种使用类似于SQL语句的查询语法快速查询数据的方法。 它是LINQ的一部分,使C#和VB.NET开发人员能够轻松地使用LINQ。 LINQ操作语法允许开发人员快速、易读地创建查询,包含…

    C# 2023年6月1日
    00
  • 使用.NET命令行编译器编译项目(如ASP.NET、C#等)

    使用.NET命令行编译器(通常是csc.exe)可以编译各种.NET项目,包括ASP.NET和C#等。下面是完整的攻略过程。 安装.NET Core SDK 首先,你需要安装.NET Core SDK,因为.NET命令行编译器是其中的一部分。你可以在官方网站上下载适用于你的操作系统的版本。安装完成后,你可以使用以下命令来检查.NET命令行编译器是否已经安装成…

    C# 2023年5月14日
    00
  • C#将Json解析成DateTable的方法

    将JSON解析成DataTable是C#中常见的需求,可用于将接口返回的JSON数据进行转换,以便于在程序中进行进一步处理。以下是将JSON解析成DataTable的步骤介绍: 步骤一:引用Newtonsoft.Json库 首先,需要在项目中引入Newtonsoft.Json库。可通过NuGet或手动导入方式进行添加,具体方式如下: NuGet方式: 在Vi…

    C# 2023年5月31日
    00
  • Asp.Net Core实现Excel导出功能的实现方法

    在本攻略中,我们将详细讲解Asp.Net Core实现Excel导出功能的实现方法,并提供两个示例说明。 安装EPPlus:首先,我们需要安装EPPlus NuGet包。我们可以使用Visual Studio的Get包管理器来安装EPPlus,或者在项目文件(.csproj)中手动添加EPPlus的NuGet包引用。例如: <ItemGroup>…

    C# 2023年5月16日
    00
  • C#中Lambda表达式的用法

    下面我来为你详细讲解“C#中Lambda表达式的用法”的完整攻略。 什么是Lambda表达式? Lambda表达式是一种语法糖(语言特性),它可以让你快速地定义一个匿名函数。Lambda表达式可以帮助我们消除冗余的代码、提高代码的可读性和可维护性。 语法格式如下: (parameters) => expression 这里parameters是形参列表…

    C# 2023年6月7日
    00
  • C#实现中文验证码的示例代码

    下面就为您详细讲解”C#实现中文验证码的示例代码”的完整攻略,其中包含两个示例说明。 1. 前置知识 在实现中文验证码之前,需要先了解以下知识: C#基础编程知识 图形绘制基础 验证码的概念和生成方式 中文字体库的使用 2. 实现过程 2.1 创建项目和添加引用 首先,我们需要创建一个控制台应用程序的项目,然后在该项目中添加System.Drawing和Sy…

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