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;
        }
    }
}

三、效果图

相关推荐
古月-一个C++方向的小白5 小时前
C++11之lambda表达式与包装器
开发语言·c++
沐知全栈开发5 小时前
Eclipse 生成 jar 包
开发语言
杭州杭州杭州6 小时前
Python笔记
开发语言·笔记·python
tanyongxi667 小时前
C++ AVL树实现详解:平衡二叉搜索树的原理与代码实现
开发语言·c++
阿葱(聪)8 小时前
java 在k8s中的部署流程
java·开发语言·docker·kubernetes
浮生带你学Java8 小时前
2025Java面试题及答案整理( 2025年 7 月最新版,持续更新)
java·开发语言·数据库·面试·职场和发展
斯是 陋室8 小时前
在CentOS7.9服务器上安装.NET 8.0 SDK
运维·服务器·开发语言·c++·c#·云计算·.net
李长渊哦9 小时前
深入理解Java中的Map.Entry接口
java·开发语言
koooo~9 小时前
JavaScript中的Window对象
开发语言·javascript·ecmascript
tju新生代魔迷9 小时前
C++:list
开发语言·c++