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

news/2024/7/7 23:28:15

文章目录

  • `TreeView` 基本的知识
    • 属性
    • 方法
    • 事件
  • `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);
            }
        }
    }
}

效果:

动画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);
            }
        }
    }
}

效果:

新建一个SQL数据库

image-20231107192018880

展示

请添加图片描述

添加父子勾选关联功能后

动画12

精彩推荐:
【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表达式

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

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


http://lihuaxi.xjx100.cn/news/1762919.html

相关文章

二分查找常见需求(持续更新中)

1.找到tmp中大于等于target的最小下标 当然如果不存在就返回tmp.length。 public int binarySearch(int[] tmp, int target) {int l 0, r tmp.length - 1;if(tmp[r] < target) {return r 1;}while(l < r) {int mid l (r - l) / 2;if(tmp[mid] < target) {l mid…

【算法 | 模拟No.3】leetcode 38. 外观数列

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【Leetcode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

DDD领域模式的模块层级及其依赖关系

DDD领域模型设计是一种常用的软件设计模式,它强调将业务逻辑和数据模型放在最核心的位置,以便更好地满足业务需求。在DDD领域模型设计中,应用程序被分为四个层次:用户界面层、应用服务层、领域模型层和基础设施层。 层次 用户界面层(Presentation Layer) 作为用户和应…

seata1.8安装部署

1.在nacos里面创建命名空间 2.下载seata安装包 3.将下载的seata解压&#xff0c;找到seata/script/server/db目录下对应数据库的sql脚本&#xff0c;创建数据库 undo_log.sql CREATE TABLE undo_log (branch_id bigint(20) NOT NULL COMMENT branch transaction id,xid varcha…

北斗导航 | ION GNSS+2023论文集及PPT(Proceedings with presentations)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== ION GNSS+2023论文集及PPT 美国导航学会IONION国际会议出版物

计算/存储虚拟化高级特性

目录 计算虚拟化特性 HA高可用 虚拟机热迁移 虚拟机快照技术 存储虚拟化特性 链接克隆 存储热迁移 裸设备映射 计算虚拟化特性 HA高可用 通过HA&#xff08;High Available&#xff09;机制&#xff0c;可以提升虚拟机的可用度&#xff0c;允许虚拟机所在的服务器节点…

中西部地区教育正获优质均衡高质量发展

教育部日前消息&#xff0c;2022年我国基础教育财政性教育经费达3.2万亿元&#xff0c;比2015年增加了1.3万亿元&#xff0c;年均增长7.7%。近些年来&#xff0c;我国基础教育各学段财政总投入和生均支出逐年只增不减&#xff0c;为推动基础教育优质均衡发展提供了有力支撑。 …

初识Java 17-2 反射

目录 转型前检查 构建例子&#xff1a;生成层次结构 优化Creator&#xff1a;使用类字面量 优化PetCounter&#xff1a;动态验证类型 更通用的递归计数 注册工厂 本笔记参考自&#xff1a; 《On Java 中文版》 转型前检查 当我们使用传统的类型转换&#xff0c;例如&…