C# WinForm TreeView 树形控件+ListView控件+菜单栏

本次案例基于WinForm框架,使用TreeView控件实现树形节点创建、层级嵌套、新增节点、删除节点、获取选中节点等基础功能,下面对全部代码进行分段拆解、逐行讲解,包含语法含义、属性作用、设计逻辑。

一、整体命名空间与窗体类定义

复制代码
namespace _2TreeView
{
    public partial class Form1 : Form
    {
        // 后续所有方法、构造函数全部写在该类内部
    }
}

代码解析:

  1. namespace _2TreeView:命名空间,作用是隔离代码,避免项目中类名重名冲突,该命名空间名称由项目创建时自动生成,和项目文件夹名称保持一致。

  2. public partial class Form1:定义窗体类Form1

    1. public:访问修饰符,代表该类公开,项目内所有代码都可以访问;

    2. partial:分部类,核心作用是将一个类的代码拆分到多个文件中。WinForm窗体默认分为两个文件:Form1.cs(我们编写逻辑的文件)、Form1.Designer.cs(系统自动生成,存放控件初始化代码);

  3. : Form:类的继承,Form1继承自系统自带的Form窗体基类,继承后Form1自动拥有窗体的所有基础能力(窗口显示、最大化、关闭、承载控件等)。

二、窗体构造函数(初始化树形节点)

构造函数在窗体启动时自动执行,主要用于初始化页面所有树形节点,搭建多层级树形结构。

复制代码
// 窗体构造函数,窗体加载时自动执行
public Form1()
{
    // 初始化窗体上所有拖拽的控件(TreeView、Button等)
    InitializeComponent();

    // 1. 创建树形顶级根节点
    TreeNode root = new TreeNode("明星"); 

    // 2. 创建根节点的一级子节点
    TreeNode childNode1 = new TreeNode("小罗");
    TreeNode childNode2 = new TreeNode("卡卡");
    TreeNode childNode3 = new TreeNode("大罗");

    // 3. 创建【卡卡】节点的二级子节点(嵌套子节点)
    TreeNode childNode2_1 = new TreeNode("卡卡1");
    TreeNode childNode2_2 = new TreeNode("卡卡2");
    TreeNode childNode2_3 = new TreeNode("卡卡3");

    // 4. 将二级子节点添加到卡卡一级节点中,形成嵌套层级
    childNode2.Nodes.Add(childNode2_1);
    childNode2.Nodes.Add(childNode2_2);
    childNode2.Nodes.Add(childNode2_3);

    // 5. 将一级子节点全部添加到顶级根节点中
    root.Nodes.Add(childNode1);
    root.Nodes.Add(childNode2);
    root.Nodes.Add(childNode3);

    // 6. 将根节点添加到TreeView控件中,绑定到页面控件
    treeView1.Nodes.Add(root);

    // 7. 默认展开TreeView所有层级节点
    treeView1.ExpandAll();
}
逐行详细解析:
  1. InitializeComponent();:系统固定方法,自动读取Designer文件中的控件配置,初始化我们拖拽到窗体上的treeView1、button1、button2等控件,所有WinForm窗体构造函数必须执行该方法,否则控件无法显示。

  2. TreeNode root = new TreeNode("明星");:实例化TreeNode节点对象,创建树形结构的顶级根节点,节点显示文本为"明星"。TreeNode是TreeView控件的核心类,代表树形结构中的每一个节点。

  3. 创建一级子节点:new TreeNode("名称"),分别创建小罗、卡卡、大罗三个独立节点,此时节点为孤立状态,未归属任何父节点。

  4. 创建二级子节点:专门为【卡卡】节点创建3个子节点(卡卡1/2/3),用于演示TreeView多层级嵌套结构

  5. childNode2.Nodes.Add(节点对象);

    1. Nodes:节点集合属性,每个TreeNode节点都自带该属性,用于存储自身的所有子节点;

    2. Add():集合专属方法,作用是将指定子节点添加到当前父节点的集合中;

    3. 此步骤完成后,卡卡节点下包含3个二级子节点,形成二级树形结构。

  6. root.Nodes.Add(childNode1);:将三个一级子节点统一添加到顶级根节点【明星】下,至此完整的树形数据结构搭建完成。

  7. treeView1.Nodes.Add(root);:将封装好的根节点绑定到页面的treeView1控件。区别:root是内存中的数据节点,treeView1是页面可视化控件,此代码实现数据绑定,页面才能展示树形结构。

  8. treeView1.ExpandAll();:控件方法,自动展开TreeView所有层级的节点,无需手动点击加号展开;如果删除该代码,页面节点默认全部折叠。

三、button1点击事件(新增一级节点)

功能:点击按钮1,在根节点【明星】下新增一个文本为string的一级子节点。

复制代码
// 新增节点按钮点击事件
private void button1_Click(object sender, EventArgs e)
{
    // 实例化新的树形节点,显示文本为string
    TreeNode t1 = new TreeNode("string");
    // 获取TreeView的第0个根节点(明星),并向其添加子节点
    treeView1.Nodes[0].Nodes.Add(t1);
}
逐行详细解析:
  1. 方法参数:object sender代表触发事件的控件(此处为button1);EventArgs e封装点击事件的附加参数,系统默认参数,固定写法。

  2. TreeNode t1 = new TreeNode("string");:创建一个全新的空白节点,展示文本为string。

  3. treeView1.Nodes[0]:treeView1.Nodes代表控件所有顶级根节点集合;索引0对应我们初始化创建的【明星】根节点。

  4. treeView1.Nodes[0].Nodes.Add(t1);:获取根节点的子节点集合,并将新节点t1添加进去,实现动态新增节点。

四、节点鼠标点击事件(获取选中节点信息)

功能:鼠标点击任意树形节点,在控制台输出节点文本,对比两种获取节点方式的区别。

复制代码
// 节点鼠标点击事件
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    // 方式1:通过控件属性获取选中节点
    Console.WriteLine(treeView1.SelectedNode);
    // 方式2:通过事件参数获取当前点击节点
    Console.WriteLine(e.Node.Text);
}
逐行详细解析:
  1. 事件参数:TreeNodeMouseClickEventArgs e:专属TreeView节点点击事件的参数,相比普通点击事件,额外封装了点击节点的所有信息。

  2. treeView1.SelectedNode:TreeView控件自带属性,用于获取上一次选中的节点;触发原理:鼠标点击瞬间,SelectedNode还未完成更新,所以获取的是旧选中节点,存在数据延迟。

  3. e.Node.Text:从事件参数中直接获取当前实时点击的节点,Text属性代表节点的展示文本,推荐使用该方式获取点击节点。

  4. Console.WriteLine():在VS控制台窗口打印内容,用于调试查看节点数据。

五、button2点击事件(删除指定节点)

功能:点击按钮2,遍历根节点下所有一级子节点,删除所有文本为string的节点;同时讲解错误遍历方式与正确遍历方式的区别。

1、被注释的错误写法(foreach遍历删除)

复制代码
// 错误写法:foreach遍历集合时禁止直接删除元素
//foreach (TreeNode node in treeView1.Nodes[0].Nodes)
//{
//    if (node.Text=="string")
//    {
//        node.Parent.Nodes.Remove(node);
//    }
//}
错误原因:

foreach是只读遍历模式,遍历过程中集合长度不允许发生变化(新增/删除元素);如果强行删除,会直接抛出集合已修改;可能无法执行枚举操作的程序异常。

2、正确写法(倒序for循环删除)

复制代码
// 删除指定节点按钮点击事件
private void button2_Click(object sender, EventArgs e)
{
    // 倒序遍历根节点下所有一级子节点
    for (int i = treeView1.Nodes[0].Nodes.Count-1; i >=0; i--)
    {
        // 根据索引获取当前遍历的节点
        TreeNode t1 = treeView1.Nodes[0].Nodes[i];
        // 判断节点文本是否为需要删除的string
        if (t1.Text == "string")
        {
            // 通过父节点集合移除当前节点
            t1.Parent.Nodes.Remove(t1);
        }
    }
}
逐行详细解析:
  1. treeView1.Nodes[0].Nodes.Count-1:获取根节点子节点集合的最后一个元素索引,作为循环起始值。

  2. i >=0; i--:从最后一个节点向前倒序遍历;优势:删除节点后,后续节点索引不会发生变动,不会出现遍历漏元素、程序报错问题。

  3. TreeNode t1 = treeView1.Nodes[0].Nodes[i];:通过索引,获取当前循环对应的节点对象。

  4. if (t1.Text == "string"):筛选目标节点,匹配需要删除的节点文本。

  5. t1.Parent.Nodes.Remove(t1);

    1. Parent属性:获取当前节点的直属父节点;

    2. Remove(节点对象):集合删除方法,从父节点的子节点集合中,移除指定节点对象。

六、补充空白点击事件

复制代码
// TreeView控件空白区域点击事件(本案例未编写业务逻辑)
private void treeView1_Click(object sender, EventArgs e)
{

}

该事件为点击TreeView空白区域时触发,和节点点击事件相互独立,本案例仅自动生成事件方法,无实际业务代码,可根据需求拓展功能(如清空选中节点、新增默认节点等)。

七、核心知识点总结

  • 树形结构层级:TreeView控件 > 顶级根节点 > 一级子节点 > 二级子节点(多层级无限嵌套);

  • 核心类与属性:TreeNode(节点实体)、Nodes(子节点集合)、Parent(父节点)、Text(节点展示文本);

  • 常用方法:Add()新增节点、Remove()删除节点、ExpandAll()展开所有节点;

  • 删除节点规范:禁止foreach遍历删除,统一使用倒序for循环执行删除操作。

------------------------------ListView控件------------------------------

次代码基于 WinForm 框架,实现 ListView 控件模拟电脑磁盘/文件夹资源管理器的效果,包含图标绑定、视图模式设置、表头添加、数据绑定、数据删除等全套基础功能。下面逐模块拆解所有代码,通俗易懂讲解每一处功能。

一、整体代码结构概述

该代码属于WinForm窗体后台代码,隶属于自定义命名空间,在窗体初始化构造方法中,完成ListView控件的所有配置与数据填充,最终实现带表头、多列数据、支持大小图标切换的资源列表界面。

复制代码
namespace _3ListView
{
    public partial class Form1 : Form
    {
        // 窗体构造方法:程序启动、窗体加载时自动执行
        public Form1()
        {
            // 所有控件初始化、配置、数据绑定代码
        }
    }
}

二、逐模块详细解析

1. 命名空间定义

复制代码
namespace _3ListView
  • 作用:命名空间相当于代码的"文件夹",用于隔离不同功能的代码,防止项目中出现类名重复、代码冲突问题。

  • 补充:_3ListView 是当前项目自定义命名空间,项目内所有窗体、工具类、方法都可以收纳在该命名空间下。

2. 窗体类定义

复制代码
public partial class Form1 : Form
  • public:访问修饰符,代表该窗体类公开,项目内所有代码都可以访问这个窗体。

  • partial:分部类关键字,核心作用:将一个窗体类拆分到两个文件中。

    • Form1.cs(当前文件):存放开发者手写的业务逻辑代码(数据绑定、控件配置);

    • Form1.Designer.cs:系统自动生成,存放拖拽控件、控件属性初始化代码;

  • : Form:类的继承,代表Form1是一个Windows窗体,继承父类Form的所有能力(窗口显示、控件承载、弹窗、关闭等基础窗口功能)。

3. 窗体构造方法

复制代码
public Form1()
{
    InitializeComponent();
    // 后续所有配置代码
}
  • 构造方法与类名必须同名,窗体被实例化(打开窗口)时,自动优先执行构造方法内的所有代码。

  • InitializeComponent();:固定必备代码,调用系统自动生成的方法,初始化窗体上所有拖拽的控件(ListView、ImageList、按钮等),如果缺失该代码,所有控件无法显示。

4. 绑定图标控件(ListView图标配置)

复制代码
//设置listview大图标的集合
listView2.LargeImageList = imageList1;
//设置listview小图标的集合
listView2.SmallImageList = imageList2;
  • 业务场景:ListView控件展示数据时,支持大图标、小图标、详情、列表等多种模式,图标需要提前存放在ImageList控件中。

  • LargeImageList 属性:绑定大图标容器imageList1,当ListView切换为【大图标视图】时,自动从imageList1中读取图标。

  • SmallImageList 属性:绑定小图标容器imageList2,当ListView切换为【小图标/详情视图】时,自动从imageList2中读取图标。

  • 补充:imageList1、imageList2 需要提前在窗体设计界面拖拽添加,并手动导入对应的图标图片。

5. 设置ListView展示视图模式

复制代码
listView2.View = View.Details;//设置展示的风格
  • View是ListView的核心属性,用于控制数据展示样式,枚举类型,一共5种可选模式:

  • 5种视图模式详解

    • View.Details:详情模式(当前代码使用),带表头、多列展示数据,和电脑资源管理器详情界面一致,支持展示名称、时间、大小等多维度数据;

    • View.LargeIcon:大图标模式,仅展示大图标+单行文字,无表头;

    • View.SmallIcon:小图标模式,仅展示小图标+单行文字,无表头;

    • View.List:列表模式,横向排列小图标数据,无表头;

    • View.Tile:平铺模式,Win10/Win11资源管理器平铺样式。

6. 添加ListView表头(数据列)

复制代码
listView2.Columns.Add("名称"); //添加一列
listView2.Columns.Add("修改时间");
listView2.Columns.Add("类型");
listView2.Columns.Add("大小");
  • Columns:ListView的列集合,专门用来存储所有表头,仅在Details详情模式下生效;

  • Columns.Add("表头名称"):新增一列表头,代码依次添加4列:名称、修改时间、类型、大小;

  • 对应界面效果:窗口顶部会出现4个列表头,后续添加的数据项,会自动对应归属到对应的列下方。

7. 创建数据项(ListView主项+子项)

ListView的数据结构分为两层:主项(ListViewItem) = 第一列数据;子项(SubItems) = 第二列及以后所有列数据,下面以三组数据统一解析:

7.1 第一条数据:win文件夹
复制代码
ListViewItem item1 = new ListViewItem("win");//创建lsitview 项
item1.SubItems.Add("2026/2/1");
item1.SubItems.Add("文件夹");
item1.SubItems.Add("20G");
  • new ListViewItem("win"):实例化数据主项,给第一列【名称】赋值为win;

  • SubItems.Add():给当前主项添加子数据,依次对应后续表头:

    • 第1个子项 → 修改时间:2026/2/1

    • 第2个子项 → 类型:文件夹

    • 第3个子项 → 大小:20G

7.2 第二条数据:C盘
复制代码
ListViewItem item2 = new ListViewItem("C盘");//创建lsitview 项
item2.SubItems.Add("2026/2/1");
item2.SubItems.Add("文件夹");
item2.SubItems.Add("202G");

逻辑和item1完全一致,新增一条磁盘数据,填充四列完整信息。

7.3 第三条数据:D盘(新增Name属性)
复制代码
ListViewItem item3 = new ListViewItem("D盘");//创建lsitview 项
item3.Name = "ss";
item3.SubItems.Add("2026/2/1");//向每一项的子项添加
item3.SubItems.Add("文件夹");
item3.SubItems.Add("208G");
  • 基础赋值逻辑同上,额外新增 item3.Name = "ss"

  • Name属性作用:给当前数据项设置唯一标识名称,后续可以通过Name精准删除、查找该数据项,是删除功能的核心依据。

8. 将数据项添加到ListView控件

复制代码
listView2.Items.Add(item1); // 向控件里面添加每一项
listView2.Items.Add(item2);
listView2.Items.Add(item3);
  • Items:ListView的数据项集合,所有展示的数据都存储在该集合中;

  • Items.Add(数据项):将我们手动创建的item1/item2/item3,添加到ListView控件中,只有执行该代码,数据才会在界面上显示;

  • 如果不执行Add方法,仅创建ListViewItem对象,数据仅存在内存中,界面无任何展示。

9. 注释代码:三种数据删除方式(重点拓展)

复制代码
//listView2.Items.Remove(item1); //指定项进行移除
// listView2.Items.RemoveAt(1); // 根据索引进行删除
// listView2.Items.RemoveByKey(item3.Name); //根据name属性进行删除

这三行代码为注释状态,取消注释即可执行删除操作,三种删除方式适配不同业务场景,详细区别:

  1. Remove(数据项对象):直接传入创建好的item对象(如item1),精准删除指定数据项;适合提前定义变量、已知对象的场景。

  2. RemoveAt(索引值):根据下标索引删除,ListView数据索引从0开始:item1=0、item2=1、item3=2;示例删除第二条数据item2;适合批量遍历删除场景。

  3. RemoveByKey(Name值):根据数据项的Name属性删除,示例中item3.Name="ss",等价于RemoveByKey("ss");适合动态查找、无固定变量的删除场景,安全性最高。

三、整体运行效果总结

程序运行后,窗体中的listView2控件以详情模式展示,顶部包含【名称、修改时间、类型、大小】4列表头,界面展示win文件夹、C盘、D盘三条完整数据,同时支持切换图标视图、三种方式删除任意一条数据,完美复刻资源管理器基础功能。

四、完整可运行代码

复制代码
using System;
using System.Windows.Forms;

namespace _3ListView
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            //初始化窗体及所有控件
            InitializeComponent();
            InitListView();
        }

        /// <summary>
        /// 初始化ListView控件,配置属性并绑定数据
        /// </summary>
        private void InitListView()
        {
            // 1、绑定图标集合:给ListView设置大图标、小图标数据源
            // LargeImageList:适配大图标视图模式
            listView2.LargeImageList = imageList1;
            // SmallImageList:适配小图标、详细信息视图模式
            listView2.SmallImageList = imageList2;

            // 2、设置展示模式为【详细信息模式】,支持多列展示数据
            listView2.View = View.Details;

            // 3、添加列头,对应文件资源的四大属性
            listView2.Columns.Add("名称");     // 资源名称
            listView2.Columns.Add("修改时间");  // 资源最后修改时间
            listView2.Columns.Add("类型");     // 资源文件类型
            listView2.Columns.Add("大小");     // 资源占用存储空间

            // 4、创建第一个ListView数据项:win文件夹
            ListViewItem item1 = new ListViewItem("win");
            // 给当前项添加子列数据
            item1.SubItems.Add("2026/2/1");
            item1.SubItems.Add("文件夹");
            item1.SubItems.Add("20G");

            // 5、创建第二个ListView数据项:C盘
            ListViewItem item2 = new ListViewItem("C盘");
            item2.SubItems.Add("2026/2/1");
            item2.SubItems.Add("文件夹");
            item2.SubItems.Add("202G");

            // 6、创建第三个ListView数据项:D盘,并设置唯一Name标识
            ListViewItem item3 = new ListViewItem("D盘");
            item3.Name = "ss"; // 用于根据键值删除数据项
            item3.SubItems.Add("2026/2/1");
            item3.SubItems.Add("文件夹");
            item3.SubItems.Add("208G");

            // 7、将创建好的所有数据项添加至ListView控件中
            listView2.Items.Add(item1);
            listView2.Items.Add(item2);
            listView2.Items.Add(item3);

            // ========== 拓展:三种删除数据项的方式(注释状态,可按需开启测试) ==========
            // 方式1:直接指定对象,删除win文件夹项
            // listView2.Items.Remove(item1); 

            // 方式2:根据索引删除,索引从0开始,此处删除第二个项(C盘)
            // listView2.Items.RemoveAt(1); 

            // 方式3:根据项的Name属性(键值)删除D盘
            // listView2.Items.RemoveByKey(item3.Name); 
        }
    }
}

------------------------菜单栏项目代码------------------------------

该代码为C# WinForm桌面程序源码,核心功能包含:代码动态创建多级下拉菜单栏、通用菜单点击事件、颜色对话框、字体对话框、文件打开/保存对话框。下面拆分所有模块,逐行进行精细化讲解。

一、整体结构概述

程序整体由命名空间、窗体类、构造方法、各类事件触发方法组成;窗体绑定了菜单栏控件、富文本框、4个功能按钮、系统自带的五大对话框控件。

二、窗体构造函数(核心:动态创建多级菜单)

构造函数在窗口初始化、程序启动时自动执行,本模块核心功能:动态创建一级、二级、三级下拉菜单栏。

复制代码
public Form1()
{
    InitializeComponent();

    // 注释:开发者自定义的JSON格式菜单结构草稿,仅作为开发参考,无执行效果
    /*[{ 
     * one:"偶像明星",
     * oneSubIems:[ ]
     * 
     * },{},{},{},{}]
     */

    // ========== 1. 创建一级菜单 ==========
    ToolStripMenuItem item1 = new ToolStripMenuItem("偶像明星"); 

    // ========== 2. 创建二级子菜单 ==========
    ToolStripMenuItem item1_1 = new ToolStripMenuItem("姆巴佩"); 
    ToolStripMenuItem item1_2 = new ToolStripMenuItem("哈兰德");
    ToolStripMenuItem item1_3 = new ToolStripMenuItem("姚明");

    // ========== 3. 创建三级子菜单(归属哈兰德) ==========
    ToolStripMenuItem item1_2_1 = new ToolStripMenuItem("魔人"); 
    ToolStripMenuItem item1_2_2 = new ToolStripMenuItem("19岁"); 

    // ========== 4. 绑定一级菜单与二级菜单 ==========
    item1.DropDownItems.Add(item1_1);
    item1.DropDownItems.Add(item1_2);
    item1.DropDownItems.Add(item1_3);

    // ========== 5. 绑定二级菜单与三级菜单 ==========
    item1_2.DropDownItems.Add(item1_2_1);
    item1_2.DropDownItems.Add(item1_2_2);

    // ========== 6. 绑定菜单点击事件 ==========
    item1_1.Click += Item1_1_Click;
    item1_3.Click += Item1_1_Click;
    item1_2.Click += Item1_1_Click;

    // ========== 7. 将一级菜单添加到窗口菜单栏 ==========
    menuStrip1.Items.Add(item1);
}

逐行细分讲解:

  1. InitializeComponent();: WinForm固定初始化方法,作用是加载设计界面拖拽的所有控件(menuStrip1、button1~4、richTextBox1、各类对话框),必须写在构造函数第一行,否则控件无法使用。

  2. JSON注释块:纯备注代码,无任何执行作用。是开发者预先规划的菜单数据结构,用来梳理一级菜单、子菜单的层级关系。

  3. ToolStripMenuItem:.NET内置菜单控件类,专门用于创建菜单栏的菜单选项;new ToolStripMenuItem("文本")代表实例化菜单,并设置菜单显示文字。

  4. 菜单层级说明:

    1. 一级菜单:偶像明星(最顶层菜单)

    2. 二级菜单:姆巴佩、哈兰德、姚明(点击一级菜单弹出)

    3. 三级菜单:魔人、19岁(仅归属哈兰德,点击哈兰德弹出)

  5. DropDownItems.Add(控件): 核心绑定方法。给当前菜单添加下拉子项,实现上下级菜单的关联。

  6. 控件.Click += 事件方法: 事件绑定语法。将多个菜单的点击事件绑定到同一个方法Item1_1_Click,减少重复代码;所有绑定的菜单,点击后都会触发该方法。

  7. menuStrip1.Items.Add(item1): 将创建好的一级菜单,挂载到窗口顶部的菜单栏控件menuStrip1上,最终让菜单显示在窗口中。


三、所有自定义事件方法详解

1. 未实现的菜单点击事件(废弃方法)

复制代码
private void Item1_3_Click(object sender, EventArgs e)
{
    throw new NotImplementedException();
}

解释

  • 该方法是系统自动生成的姚明菜单专属点击事件,但开发者并未使用;

  • throw new NotImplementedException():主动抛出"未实现该功能"异常,如果调用此方法,程序会直接报错;属于冗余废弃代码。

2. 通用菜单点击事件(核心菜单方法)

复制代码
private void Item1_1_Click(object sender, EventArgs e)
{
    MessageBox.Show(((ToolStripMenuItem)sender).Text);
}

逐行解释

  • 方法参数:

    • sender:object类型,代表触发当前事件的控件(本例中就是被点击的菜单);

    • EventArgs e:封装事件附加参数,菜单点击事件中无实际作用;

  • (ToolStripMenuItem)sender:强制类型转换。因为sender默认是object基类类型,无法直接读取菜单属性,需要转为ToolStripMenuItem菜单类型;

  • .Text:获取被点击菜单的显示文字(如姆巴佩、哈兰德);

  • MessageBox.Show():弹出系统提示框,展示被点击菜单的名称。

3. 预设菜单【军事2】点击事件

复制代码
private void 军事2ToolStripMenuItem_Click(object sender, EventArgs e)
{
    MessageBox.Show("军事2");
}

解释:该菜单是开发者直接在设计界面拖拽创建的静态菜单,非代码动态创建;点击后直接弹出提示框,固定显示文字"军事2"。

4. 按钮1:颜色对话框功能

复制代码
private void button1_Click(object sender, EventArgs e)
{
    DialogResult r =  this.colorDialog1.ShowDialog();
    if (r==DialogResult.OK)
    {
       richTextBox1.ForeColor = colorDialog1.Color;
    }
}

功能:修改富文本框文字颜色,详细解释:

  1. colorDialog1.ShowDialog():弹出系统自带的颜色选择对话框;

  2. DialogResult r:接收对话框的操作返回值,枚举类型;

  3. r==DialogResult.OK:判断用户是否在颜色弹窗中点击【确定】按钮(取消则不执行);

  4. richTextBox1.ForeColor:富文本框的文字颜色属性,将用户选中的颜色赋值给该属性,完成文字换色。

5. 按钮2:字体对话框功能

复制代码
private void button2_Click(object sender, EventArgs e)
{
    if (this.fontDialog1.ShowDialog() == DialogResult.OK)
    {
        //richTextBox1.Font  =  fontDialog1.Font; 
        richTextBox1.SelectionFont = fontDialog1.Font;
    }
}

功能:修改富文本框选中文本的字体样式,详细解释:

  1. fontDialog1.ShowDialog():弹出系统字体设置弹窗,可设置字体、字号、加粗、斜体;

  2. 注释代码richTextBox1.Font:作用是修改整个富文本框所有文字的字体;

  3. 生效代码SelectionFont:仅修改鼠标选中的部分文字字体,优先级更高,也是本程序的设计逻辑。

6. 按钮3:文件打开对话框

复制代码
private void button3_Click(object sender, EventArgs e)
{
    openFileDialog1.ShowDialog();
    MessageBox.Show(openFileDialog1.FileName);
}

功能:选取本地文件并获取文件完整路径

  • openFileDialog1:文件打开对话框控件,用于浏览、选择本地电脑文件;

  • openFileDialog1.FileName:获取选中文件的绝对完整路径(包含盘符、文件夹、文件名、后缀);

  • 最后通过弹窗展示该文件路径。

7. 按钮4:文件保存对话框

复制代码
private void button4_Click(object sender, EventArgs e)
{
    saveFileDialog1.ShowDialog();
    MessageBox.Show(saveFileDialog1.FileName);
}

功能:自定义文件保存位置与名称,并获取保存路径

  • saveFileDialog1:文件保存对话框控件,用于选择保存文件夹、自定义文件名称;

  • FileName:获取用户设置的保存完整路径,弹窗展示路径信息。


四、整体运行流程总结

  1. 程序启动,执行Form1构造函数,初始化所有界面控件;

  2. 自动动态创建【偶像明星】多级菜单栏,并绑定通用点击事件;

  3. 用户操作:

    1. 点击菜单:弹窗展示对应菜单名称;

    2. 按钮1:设置富文本文字颜色;按钮2:设置选中文本字体;

    3. 按钮3:选择本地文件并查看路径;按钮4:设置文件保存位置并查看路径。

相关推荐
码云数智-园园1 小时前
码云数智网站SEO设置指南:如何让百度搜索到你的网站
开发语言
赴生-1 小时前
C++进阶 智能指针
开发语言·c++
chao1898441 小时前
GNSS软件接收机 MATLAB 实现(GPS L1 CA码)
开发语言·matlab
清水白石0081 小时前
让对象像函数一样工作:深入理解 Python `__call__` 的作用与实战场景
开发语言·python
AI科技星1 小时前
氢原子基态能级跃迁紫外频段光子频率计算
开发语言·网络·量子计算·agi·拓扑学
devilnumber2 小时前
Java Lambda 表达式 200 条常见问题、坑点、易错点、规范清单
java·开发语言
zzz_23682 小时前
【Java基础】二叉树遍历与红黑树的完美平衡艺术——从递归崩溃到自平衡的硬核拆解
java·开发语言
程序员zgh2 小时前
C++ 万能引用与完美转发
c语言·开发语言·c++·经验分享·学习
Chris-zz2 小时前
lua流程控制
开发语言·lua