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节点中。我们演示了两个示例,第一个展示了单表数据读取,第二个展示了多张表数据读取,希望可以帮助到读者。

阅读剩余 82%

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

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

相关文章

  • 浅谈JsonObject中的key-value数据解析排序问题

    浅谈JsonObject中的key-value数据解析排序问题——攻略 问题描述 在使用JsonObject进行key-value数据解析时,有时我们会发现得到的数据不是按照期望的顺序排列的。这个问题会给我们的主观体验带来很大不便,并且也可能对我们的后续工作造成困扰。所以在这篇文章中,我们将会讨论这个问题的产生原因以及解决方案。 问题产生的原因 当我们使用J…

    C# 2023年6月1日
    00
  • ASP.NET 文件断点续传实现代码

    ASP.NET 文件断点续传是一种常用的文件上传方式,可以在上传过程中支持中断后恢复上传,从而提高了文件上传的可靠性和效率。下面我将为你详细讲解ASP.NET 文件断点续传实现的代码攻略: 1. 实现思路 实现文件断点续传的方法是通过客户端和服务器端相互配合来完成。当客户端需要上传一个文件时,首先将文件根据设定的分块大小分成若干个块,然后逐一上传到服务器端,…

    C# 2023年5月31日
    00
  • C#通过属性名称获取(读取)属性值的方法

    获取C#对象的属性值通常可以使用对象的属性名称来实现。在 C# 中,属性名称是一个字符串,可以在运行时利用反射机制获取对象的属性信息,并通过属性名称获取属性值。 首先,在 C# 中利用反射机制获取对象的属性信息,可以通过以下步骤来实现: 获取对象的类型信息:使用Type.GetType或typeof关键字获取对象类型信息,例如: csharp Type ty…

    C# 2023年5月31日
    00
  • C#运行CGI程序实例

    下面是一份详细的C#运行CGI程序的完整攻略: 简介 CGI(Common Gateway Interface)是Web服务器与应用程序之间通信的一种标准接口。C#作为一种强大的编程语言,可以通过配置IIS来实现运行CGI程序。 配置IIS 首先,在IIS中添加CGI程序的支持。 打开IIS管理器,选择对应的网站,右击“属性”选项,进入“HTTP头”标签。 …

    C# 2023年6月1日
    00
  • C#实现飞行棋游戏

    C#实现飞行棋游戏攻略 1. 游戏规则概述 飞行棋是一种常见的棋类游戏,又称“飞行棋”,据传说源于古印度的游戏,起源于印度古董陀罗尼。其游戏规则如下: 1.1 游戏棋盘 游戏棋盘为正方形,格数为12×12。每个玩家有4个飞机,分为红、黄、蓝、绿四色。 1.2 开始游戏 游戏开始时,每个玩家的4架飞机都在停机坪上。每次掷骰子,6点时,可以先从停机坪起飞一架飞机…

    C# 2023年6月6日
    00
  • C#实现文字视频生成器的示例代码

    让我为您详细讲解一下“C#实现文字视频生成器的示例代码”的完整攻略。 简介 文字视频生成器是一种将文本内容转换为视频的工具,通常用来制作广告、宣传视频等。本攻略将介绍如何使用C#实现一个简单的文字视频生成器。 准备工作 要实现文字视频生成器,我们需要使用到以下工具和库: C#编程语言 FFmpeg:一个跨平台的视频处理工具,可以通过命令行方式调用 Emgu.…

    C# 2023年6月6日
    00
  • 通用的CRUD之LiteDB

    前言 你要开发一个系统,是不是首要任务是先建库,建表,建字段,既所谓的数据建模(听起来高大上一点,数据建模也确实是个烧脑的活),要费不少功夫。不知你是否遇到过这样的场景。A产品有3个测试参数,B产品有6个测试参数,而且值和类型都各不相同,用SQL你要怎么建表呢?有人会说这简单“参数名,参数值两列搞定”,NO!数据类型考虑了吗,数据量考虑了吗?有人又说”每个参…

    C# 2023年5月6日
    00
  • C# 调用Delphi dll 实例代码

    下面是“C# 调用 Delphi dll 实例代码”的完整攻略: 一、前置条件 在开始之前,要确保你已经安装好了以下工具: 1.安装好了 Delphi 开发工具。 2.安装好了 Visual Studio 开发工具。 二、制作 Delphi 所需的 DLL 1.打开 Delphi 开发工具,新建一个控制台应用程序。 2.在 Delphi 的项目属性中,将项目…

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