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];
}
}
}
该代码主要实现以下功能:
- 连接数据库;
- 执行查询,读取每一行的数据;
- 根据数据中的父节点ID,找到父节点的TreeNode对象;
- 将该节点添加到父节点中或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技术站