C#高级:Winform桌面开发中TreeView的基础例子

一、方案一:免递归使用树

cs 复制代码
namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 自定义树实体
        /// </summary>
        public class WinFormTree
        {
            /// <summary>
            /// 标签名称
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            /// 本节点ID(根节点Pid=0)
            /// </summary>
            public int Id { get; set; }
            /// <summary>
            /// 父节点ID
            /// </summary>
            public int Pid { get; set; }
        }

        //点击触发自定义弹窗输入
        private async void button1_Click(object sender, EventArgs e)
        {
            // 假设这是数据源
            List<WinFormTree> data = new List<WinFormTree>
            {
                new WinFormTree { Id = 1, Name = "爷爷", Pid = 0 },
                new WinFormTree { Id = 2, Name = "父亲", Pid = 1 },
                new WinFormTree { Id = 3, Name = "儿子", Pid = 2 },
                new WinFormTree { Id = 4, Name = "女儿", Pid = 2 } // 假设加个子节点
            };

            // 调用方法来构建树
            BuildTree(treeView1,data);
        }

        /// <summary>
        /// 构建树
        /// </summary>
        /// <param name="data"></param>
        private void BuildTree(TreeView treeView,List<WinFormTree> data)
        {
            //清空树
            treeView.Nodes.Clear();

            // 使用字典存储 id -> TreeNode 的映射
            Dictionary<int, TreeNode> nodeDict = new Dictionary<int, TreeNode>();

            // 根节点
            TreeNode rootNode = null;

            // 遍历所有数据,构建树
            foreach (var item in data)
            {
                TreeNode node = new TreeNode(item.Name);

                // 存储当前节点
                nodeDict.Add(item.Id, node);

                // 如果是根节点,保存根节点
                if (item.Pid == 0)
                {
                    rootNode = node;
                }
                else
                {
                    // 找到父节点并将当前节点添加到父节点下
                    if (nodeDict.ContainsKey(item.Pid))
                    {
                        nodeDict[item.Pid].Nodes.Add(node);
                    }
                }
            }

            // 将树根节点添加到 TreeView 中
            if (rootNode != null)
            {
                treeView.Nodes.Add(rootNode);
            }
        }

        /// <summary>
        /// 树节点选中事件(双击进入该方法)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            // 获取选中的节点的文本内容
            string selectedNodeText = e.Node.Text;

            // 将选中的节点文本设置到Label控件
            label1.Text = "选中的标签是: " + selectedNodeText;
        }
    }
}

二、方案二:递归求树

cs 复制代码
namespace WinFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 自定义树实体
        /// </summary>
        public class WinFormTree
        {
            /// <summary>
            /// 标签名称
            /// </summary>
            public string Name { get; set; }
            /// <summary>
            /// 本节点ID(根节点Pid=0)
            /// </summary>
            public int Id { get; set; }
            /// <summary>
            /// 父节点ID
            /// </summary>
            public int Pid { get; set; }
        }

        //点击触发自定义弹窗输入
        private async void button1_Click(object sender, EventArgs e)
        {
            // 假设这是数据源
            List<WinFormTree> data = new List<WinFormTree>
            {
                new WinFormTree { Id = 1, Name = "爷爷", Pid = 0 },
                new WinFormTree { Id = 2, Name = "父亲", Pid = 1 },
                new WinFormTree { Id = 3, Name = "儿子", Pid = 2 },
                new WinFormTree { Id = 4, Name = "女儿", Pid = 2 } // 假设加个子节点
            };

            // 调用方法来构建树
            BuildTree(treeView1,data);
        }

        /// <summary>
        /// 构建树
        /// </summary>
        /// <param name="data"></param>
        private void BuildTree(TreeView treeView,List<WinFormTree> data)
        {
            //清空树
            treeView.Nodes.Clear();

            // 根节点
            TreeNode rootNode = GetTreeByData(data);

            // 将树根节点添加到 TreeView 中
            if (rootNode != null)
            {
                treeView.Nodes.Add(rootNode.FirstNode);
            }
        }
        private TreeNode GetTreeByData(List<WinFormTree> data, int parentId = 0)
        {
            // 使用 LINQ 获取所有子节点
            var nodes = data
                .Where(x => x.Pid == parentId)
                .Select(item =>
                {
                    var node = new TreeNode(item.Name);
                    node.Nodes.AddRange(GetTreeByData(data, item.Id).Nodes.Cast<TreeNode>().ToArray()); // 递归添加子节点
                    return node;
                })
                .ToList();

            // 创建一个父节点并将子节点添加进去
            var parentNode = new TreeNode();
            parentNode.Nodes.AddRange(nodes.ToArray());  // 添加所有子节点
            return parentNode;
        }





        /// <summary>
        /// 树节点选中事件(双击进入该方法)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            // 获取选中的节点的文本内容
            string selectedNodeText = e.Node.Text;

            // 将选中的节点文本设置到Label控件
            label1.Text = "选中的标签是: " + selectedNodeText;
        }
    }
}

三、效果图

相关推荐
Nemo_XP40 分钟前
HttpHelper类处理两种HTTP POST请求
c#
黄雪超7 小时前
JVM——函数式语法糖:如何使用Function、Stream来编写函数式程序?
java·开发语言·jvm
ThetaarSofVenice7 小时前
对象的finalization机制Test
java·开发语言·jvm
思则变7 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
lijingguang8 小时前
在C#中根据URL下载文件并保存到本地,可以使用以下方法(推荐使用现代异步方式)
开发语言·c#
¥-oriented8 小时前
【C#中路径相关的概念】
开发语言·c#
CoderCodingNo8 小时前
【GESP】C++四级考试大纲知识点梳理, (7) 排序算法基本概念
开发语言·c++·排序算法
ArabySide8 小时前
【WCF】通过AOP实现基于JWT的授权与鉴权的实践
c#·jwt·aop·wcf
恋猫de小郭8 小时前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin
JosieBook9 小时前
【Java编程动手学】使用IDEA创建第一个HelloJava程序
java·开发语言·intellij-idea