下面是详解“详解C#如何实现树形图列表”的完整攻略。
1. 准备工作
在实现树形图列表之前,需要确保已经有一个能够与数据库交互的C#工程并能够成功地从数据库中获取数据。此外,我们还需要一个能够在前端界面展示数据结构的控件,常用的控件包括TreeView和DataGrid。
2. 数据库中存储数据结构
在数据库中,我们可以使用关系型、非关系型或基于图的数据库来存储树形结构数据。在这里,我们使用关系型数据库MySQL为例。
创建一张名为tree
的表,该表包含三个字段:ID
、ParentID
和Name
。其中,ID
和ParentID
均为整型,Name
为字符串类型。
CREATE TABLE `tree` (
`ID` int(11) NOT NULL,
`ParentID` int(11) NOT NULL,
`Name` varchar(50) NOT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
表中的数据如下:
ID | ParentID | Name |
---|---|---|
1 | 0 | root |
2 | 1 | node1 |
3 | 1 | node2 |
4 | 2 | node1-1 |
5 | 2 | node1-2 |
6 | 4 | node1-1-1 |
7 | 4 | node1-1-2 |
8 | 5 | node1-2-1 |
9 | 5 | node1-2-2 |
3. C#代码实现
3.1 从数据库中获取数据
为了从MySQL数据库中获取数据,我们需要安装MySql.Data Nuget包,并使用下列代码获取数据:
using MySql.Data.MySqlClient;
...
string connectionString = "server=127.0.0.1;user id=root;password=123456;database=test;charset=utf8;";
string query = "SELECT ID, ParentID, Name FROM tree ORDER BY ID;";
List<TreeNode> nodes = new List<TreeNode>(); // TreeNode为控件TreeView中的节点类
using (var connection = new MySqlConnection(connectionString))
{
connection.Open();
using (var command = new MySqlCommand(query, connection))
{
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
int id = reader.GetInt32(0);
int parentId = reader.GetInt32(1);
string name = reader.GetString(2);
nodes.Add(new TreeNode(name, id.ToString())); // 将从数据库中读取的数据添加到TreeNode控件中
}
}
}
}
3.2 构建树形结构
将从数据库中读取到的数据添加到TreeNode控件中后,我们仍无法直接得到展示整个树形结构所需的根节点。在这种情况下,我们需要使用递归函数来构建整个树形结构。下面的代码展示了如何在控件TreeView中实现递归构建树形结构的函数:
private static void LoadTreeView(TreeNode parentNode, List<TreeNode> nodes)
{
foreach (var node in nodes)
{
if (node.Parent?.Name == parentNode.Name)
{
parentNode.Nodes.Add(node);
LoadTreeView(node, nodes);
}
}
}
3.3 绑定数据
将树形结构数据绑定到TreeView上的方式非常简单:
treeView1.Nodes.Clear(); //清空之前的节点,避免重复加载
TreeNode root = new TreeNode("root", "0"); // 创建根节点
treeView1.Nodes.Add(root); // 添加根节点到TreeView中
LoadTreeView(root, nodes); // 递归实现树形结构
这样,我们就完成了树形数据的绑定。
4. 示例
下面的代码展示了如何在WPF中使用TreeView控件展示树形结构:
<TreeView x:Name="treeView1"></TreeView>
public MainWindow()
{
InitializeComponent();
LoadTreeView();
}
private void LoadTreeView()
{
string connectionString = "server=127.0.0.1;user id=root;password=123456;database=test;charset=utf8;";
string query = "SELECT ID, ParentID, Name FROM tree ORDER BY ID;";
List<TreeNode> nodes = new List<TreeNode>();
using (var connection = new MySqlConnection(connectionString))
{
connection.Open();
using (var command = new MySqlCommand(query, connection))
{
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
int id = reader.GetInt32(0);
int parentId = reader.GetInt32(1);
string name = reader.GetString(2);
nodes.Add(new TreeNode(name, id.ToString()));
}
}
}
}
treeView1.Nodes.Clear();
TreeNode root = new TreeNode("root", "0");
treeView1.Nodes.Add(root);
LoadTreeView(root, nodes);
}
private static void LoadTreeView(TreeNode parentNode, List<TreeNode> nodes)
{
foreach (var node in nodes)
{
if (node.Parent?.Name == parentNode.Name)
{
parentNode.Nodes.Add(node);
LoadTreeView(node, nodes);
}
}
}
通过上述代码,我们可以得到如下所示的树形结构:
root
|-node1
| |-node1-1
| | |-node1-1-1
| | |-node1-1-2
| |-node1-2
| |-node1-2-1
| |-node1-2-2
|-node2
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C#如何实现树形图列表 - Python技术站