• 【WinForm详细教程八】WinForm中的TreeView控件


    TreeView 控件 用于展示分层数据,它以树形结构展示信息,每个节点可以有一个或多个子节点。TreeView 控件允许用户以可展开和可折叠的形式查看复杂的层次信息。

    TreeView 基本的知识

    属性

    • Nodes: 一个 TreeNodeCollection,包含控件的根节点。
    • SelectedNode: 获取或设置当前选中的 TreeNode。
    • CheckBoxes: 确定是否在每个树节点旁边显示复选框。
    • ShowPlusMinus: 确定是否显示用于展开和折叠树节点的加号和减号。
    • ShowLines: 确定是否显示树节点之间的连接线。

    方法

    • BeginUpdate(): 暂停绘制控件,可以用于在添加大量节点时避免重绘,提高性能。
    • EndUpdate(): 恢复正常绘制控件,与 BeginUpdate() 配对使用。
    • CollapseAll(): 折叠所有的树节点。
    • ExpandAll(): 展开所有的树节点。
    • GetNodeAt(): 返回位于指定点的 TreeNode。

    事件

    • AfterCheck / BeforeCheck: 在节点的复选框被用户选中或取消选中之后/之前发生。
    • AfterSelect / BeforeSelect: 在选择某个节点之后/之前发生。
    • AfterCollapse / BeforeCollapse: 在节点被折叠之后/之前发生。
    • AfterExpand / BeforeExpand: 在节点被展开之后/之前发生。
    • NodeMouseClick: 当鼠标单击 TreeNode 时发生。

    节点介绍 - TreeNode

    • Name: 节点的唯一标识符。
    • Text: 节点显示的文本。
    • Nodes: 子节点的集合。

    动态加载菜单表

    • 数据库中存储节点与子节点的关系,但层次关系不明显。
    • 动态加载数据到 TreeView 控件的流程:
      1. 从数据库获取表数据。
      2. 使用递归方法创建节点,并添加到 TreeView。
      3. 调用方法在 TreeView 中创建并显示层次结构数据。

    TreeView 节点的勾选处理

    • 当父节点勾选或取消勾选时,所有子节点状态跟随变化。
    • 任一子节点勾选,父节点也应勾选。
    • 所有子节点都未勾选,父节点也不勾选。

    TreeView 案例演示

    案例一:

    namespace WinFormsTest
    {
        public partial class frmTreeView : Form
        {
            public frmTreeView()
            {
                InitializeComponent();
            }
    
            private void frmTreeView_Load(object sender, EventArgs e)
            {
                TreeView fileTree = new TreeView();
                // 单独设置 Width 和 Height
                fileTree.Width = 200;  // 设置宽度为200像素
                fileTree.Height = 600; // 设置高度为400像素
    
                // 或者使用 Size 属性同时设置宽度和高度
                fileTree.Size = new Size(200, 300); // 宽度200像素,高度400像素
                // 开始更新节点,防止在添加节点时进行重绘
                fileTree.BeginUpdate();
                TreeNode rootNode = new TreeNode("我的电脑");
                fileTree.Nodes.Add(rootNode);
                // 添加几个文件夹作为子节点
                TreeNode documentsNode = new TreeNode("文档");
                TreeNode picturesNode = new TreeNode("图片");
                TreeNode musicNode = new TreeNode("音乐");
                TreeNode videoNode = new TreeNode("视频");
                rootNode.Nodes.Add(documentsNode);
                rootNode.Nodes.Add(picturesNode);
                rootNode.Nodes.Add(musicNode);
                rootNode.Nodes.Add(videoNode);
                // 完成节点添加后,恢复控件的绘制
                fileTree.EndUpdate();
                fileTree.AfterSelect += new TreeViewEventHandler(fileTree_AfterSelect);
                this.Controls.Add(fileTree);
            }
            private void fileTree_AfterSelect(object sender, TreeViewEventArgs e)
            {
                if (e.Node.Text != "我的电脑")
                {
                    // 当用户选择一个节点时,显示选中节点的信息
                    MessageBox.Show("选中的文件夹: " + e.Node.Text);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    效果:

    动画10

    案例二:

    using System.Data;
    using WinFormsTest.Helper;
    namespace WinFormsTest
    {
        public partial class frmTreeView2 : Form
        {
            public frmTreeView2()
            {
                InitializeComponent();
            }
    
            private void frmTreeView2_Load(object sender, EventArgs e)
            {
                treeView1.Nodes.Clear();//清除所有节点
                //1. 获取数据
                DataTable dtMenus = DBHelper.GetDataTable("select Id,MName,ParentId from MenuInfos", 1);
                //3.调用方法,添加节点
                CreateNode(dtMenus, null, 0);
            }
    
            //2.添加节点(递归)
            private void CreateNode(DataTable dt, TreeNode pNode, int parentId)
            {
                //1.获取要创建的节点数据
                DataRow[] rows = dt.Select("ParentId=" + parentId);
                if (rows.Length > 0)
                {
                    foreach (DataRow r in rows)
                    {
                        //2.新建子节点
                        TreeNode node = new TreeNode();
                        node.Name = r["Id"].ToString();
                        node.Text = r["MName"].ToString();
                        //3.直接添加到TreeView Nodes  还是添加指定节点的Nodes里? 
                        if (pNode != null)
                            pNode.Nodes.Add(node);
                        else
                            treeView1.Nodes.Add(node);
                        //4.判断当前节点下有没有子节点
                        //这个是递归,直到rows为0即当前节点没有子节点时结束递归
                        CreateNode(dt, node, int.Parse(node.Name));
                    }
                }
            }
            
    /添加父子勾选关联功能        
    //1.父节点勾选或取消,它的所有子节点与它一致  
    //2.只要有一个子节点勾选,父节点就勾选
    //	子节点全部不勾选,父节点就不勾选
            bool isMouseClick = true;
            private void treeView1_NodeMouseClick_1(object sender, TreeNodeMouseClickEventArgs e)
            {
                isMouseClick = false;
                //子节点勾选
                SetChildNodesState(e.Node);
                //父节点勾选
                SetParentNodeState(e.Node);
                isMouseClick = true;
            }
            private void treeView1_AfterCheck_1(object sender, TreeViewEventArgs e)
            {
                if (isMouseClick)
                {
                    treeView1.SelectedNode = e.Node; //当前操作节点选中
                }
            }
    
            //递归处理子节点的勾选
            private void SetChildNodesState(TreeNode node)
            {
                if (node.Nodes.Count > 0)
                {
                    foreach (TreeNode n in node.Nodes)
                    {
                        n.Checked = node.Checked;
                        SetChildNodesState(n);
                    }
                }
            }
            private void SetParentNodeState(TreeNode node)
            {
                TreeNode pNode = node.Parent;//获取父节点
                if (pNode != null)
                {
                    bool bl = false;
    
                    foreach (TreeNode n in pNode.Nodes)
                    {
                        if (n.Checked)
                        {
                            bl = true;
                            break;
                        }
                    }
                    pNode.Checked = bl;
                    SetParentNodeState(pNode);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100

    效果:

    新建一个SQL数据库

    image-20231107192018880

    展示

    请添加图片描述

    添加父子勾选关联功能后

    动画12

    【WinForm详细教程】源代码获取方式

    在这里插入图片描述

    精彩推荐:
    【C#进阶一】C#中的数组(Array)、集合(ArrayList,Queue,Stack, HashList)、List<T>、字典(Dictionary<K,T>)和双向链表LinkedList
    【C#进阶八】C#中的序列化与反序列化下(二进制序列化、XML序列化及JSON序列化)

    【C#进阶】C#语法中一些常用知识点总结
    【WinForm详细教程一】WinForm中的窗体、Label、TextBox及Button控件、RadioButton和CheckBox、ListBox
    【WinForm详细教程三】WinForm中的NumericUpDown、PictureBox、RichTextBox及三种Timer控件
    【WinForm详细教程四】WinForm中的ProgressBar 、ImageList和ListView控件
    【WinForm详细教程五】WinForm中的MenuStrip 、ContextMenuStrip 、ToolStrip、StatusStrip控件
    【WinForm详细教程六】WinForm中的GroupBox和Panel 、TabControl 、SplitContainer控件
    【C#进阶】C#中的委托、事件、回调函数、匿名函数和lambda表达式

    如果你对智能建造专业感兴趣,或者是相关方向的学生,老师或者从业人员,欢迎通过微信公众号【智能建造小硕】加入我们!

    在这里插入图片描述
    希望有所帮助,同时欢迎关注我们,后面将更新更多相关内容!

  • 相关阅读:
    使用 Docker 和 HuggingFace 实现 NLP 文本情感分析应用
    OSG粒子系统特效-----雨雪、爆炸、烟雾
    complete完成量
    YOLOv5:对yolov5n模型进一步剪枝压缩
    组合继承
    Babylonjs学习笔记(二)——创建基本材质
    华为机试题:HJ3 明明的随机数
    【接口测试】如何在 Eolink Apilkit 中使用 cookie ?
    故障诊断 | 用于跨机器工况下故障诊断的深度判别迁移学习网络附Pytorch代码
    开始报名!龙蜥社区走进 Arm MeetUp 议程硬核剧透来了
  • 原文地址:https://blog.csdn.net/QH2107/article/details/134277456