【28】C# WinForm入门到精通 ——多文档窗体MDI【属性、方法、实例、源码】【多窗口重叠、水平平铺、垂直平铺、窗体传值】

文章目录

  • 1多文档窗体MDI
  • 2 基本设置
  • 3 实例:多窗口重叠、水平平铺、垂直平铺
    • 3.1 主窗口属性设置
    • 3.2 主窗口
    • 3.3 主窗口窗口添加MenuStrip菜单
    • 3.4 添加处理函数
    • 3.5 测试效果
  • 4 利用窗体参数定义进行传值
    • 4.1 在Form2、Form3添加相关控件
    • 4.2 Form3 定义函数public Form3(string varName, string varEmail)
    • 4.3 在Form2添加处理函数
    • 4.4 运行结果
  • 5 避免重复打开同一个子窗口
  • 6 通过类属性进行数据传值

  • WinForm 是 Windows Form 的简称,是基于 .NET Framework 平台的客户端(PC软件)开发技术,是 C# 语言中的一个重要应用。

  • .NET 提供了大量 Windows 风格的控件和事件,可以直接拿来使用。

  • 本专栏内容按照标题序号逐渐深入的,如有不懂的基础问题,可看前面教程

  • 教程从属性、方法、事件、实例等方面展开讲解,图文并茂、超详细必要的地方都有 示例、代码 ,最后附 综合实例+源码

1多文档窗体MDI

  • MDI (Multiple Document Interface) 窗体被称为多文档窗体,它是很多 Windows 应用程序中常用的界面设计。

  • 将多控件窗体在同一窗体中打开,可以设置重叠打开,平捕打开等,多文档界面,用于同时显示多个文档。

  • 在项目中使用MDI窗体时,通常将一个MDI窗口窗体作为父窗体,父窗体可以将多个子窗体包容在它的工作区之中。

2 基本设置

  • 1.1 设置:窗口属性IsMDIContainer 设为 true;
    在这里插入图片描述

当然,也可以在程序设定

this.IsMdiContainer = True;
  • 1.2 子级窗体在MDI中打开,需先设置位于MDI窗体中
Form1 f3 = new Form1();
f3.MdiParent = this;        
f3.Show();
  • 1.3 窗口打开最大化
f3.WindowState=FormwindowState.Maximized

3 实例:多窗口重叠、水平平铺、垂直平铺

排列MDI窗体函数public void LayoutMdi(MdiLayout value)

value是MdiLayout的枚举值之一,用来定义MDI子窗体的布局。

参数含义
Cascade层叠排列MDI子窗体
TileHorizontal水平平铺MDI子窗体
TileVertical垂直平铺MDI子窗体

3.1 主窗口属性设置

1 新建一个主窗口,并将属性IsMdiContainer设为True

在这里插入图片描述

3.2 主窗口

  • 2 .添加窗口 Form2 ( 一会代码中用Form2创建新的窗口)
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.3 主窗口窗口添加MenuStrip菜单

  • 3 From1窗口添加MenuStrip菜单

并添加 菜单子选项
**加粗样式**

3.4 添加处理函数

双击 “子窗口2”、“重叠窗口”、“水平平铺”、“垂直平铺”,进入事件函数,添加处理代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WinFormTest2
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void 窗口2ToolStripMenuItem_Click(object sender, EventArgs e)//创建新窗口{Form2 Mdichild = new Form2();Mdichild.MdiParent = this;Mdichild.Show();}private void 重叠窗口ToolStripMenuItem_Click(object sender, EventArgs e){this.LayoutMdi(MdiLayout.Cascade);}private void 水平平铺ToolStripMenuItem1_Click(object sender, EventArgs e){this.LayoutMdi(MdiLayout.TileHorizontal);}private void 垂直平铺ToolStripMenuItem1_Click(object sender, EventArgs e){this.LayoutMdi(MdiLayout.TileHorizontal);}}
}

3.5 测试效果

在这里插入图片描述

点击子窗口2,新建窗口
在这里插入图片描述

下图分别是 “重叠窗口”、“水平平铺”、“垂直平铺” 效果
在这里插入图片描述

4 利用窗体参数定义进行传值

  • 添加Form3 构造函数定义相关参数public Form3(string varName, string varEmail)
  • 在Form2里创建Form3实例并传入参数,在Form3里接收处理相关参数

4.1 在Form2、Form3添加相关控件

在这里插入图片描述
在这里插入图片描述

4.2 Form3 定义函数public Form3(string varName, string varEmail)

Form2 .c3

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WinFormTest2
{public partial class Form3 : Form{// 定义私有变量private string _name;private string _email;// Form3 定义相关参数public Form3(string varName, string varEmail){InitializeComponent();this._name = varName;this._email = varEmail;listBox1.Items.Add(this._name);listBox1.Items.Add(this._email);}private void button1_Click(object sender, EventArgs e){//MessageBox.Show("感谢使用!");Form2 form2 = new Form2();form2.MdiParent = this.MdiParent; // 设置Form2受MDI控制form2.Show();this.Close();}}
}

4.3 在Form2添加处理函数

Form2 .cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WinFormTest2
{public partial class Form2 : Form{public Form2(){InitializeComponent();}private void Form2_Load(object sender, EventArgs e){textBox1.Text = "";textBox1.Focus();}private void button1_Click(object sender, EventArgs e){if (textBox1.Text == "" || textBox2.Text == ""){MessageBox.Show("姓名或邮箱不能为空!", "信息提示");}else{this.Hide();Form3 childForm3 = new Form3(this.textBox1.Text, this.textBox2.Text);childForm3.MdiParent = this.MdiParent; // 设置Form3受MDI控制childForm3.Show();}}}
}

4.4 运行结果

在这里插入图片描述

5 避免重复打开同一个子窗口

前面的例子中,我们点击子菜单中的 “子窗口2”,会重复创建打开多个Form2

在这里插入图片描述

        private void 窗口2ToolStripMenuItem_Click(object sender, EventArgs e)//创建新窗口{// 打开子窗体Form2 Mdichild = new Form2();Mdichild.MdiParent = this;Mdichild.Show();}

检查是否已经打开了此MDI窗体,就弹窗提示,并结束;避免重复打开同一个子窗口

        private void 窗口2ToolStripMenuItem_Click(object sender, EventArgs e)//创建新窗口{// 检查是否已经打开了此MDI窗体,避免重复打开同一个子窗口foreach (Form childrenForm in this.MdiChildren){// 检查是不是当前子窗体名称if (childrenForm.Name == "Form2"){// 是则显示,并激活该窗体childrenForm.Visible = true;childrenForm.Activate();MessageBox.Show(childrenForm.Name+ "已经打开,请勿重复打开同一个子窗口");return;}}// 打开子窗体Form2 Mdichild = new Form2();Mdichild.MdiParent = this;Mdichild.Show();}

打开 Form2
在这里插入图片描述

重复打开 Form2时
在这里插入图片描述

6 通过类属性进行数据传值

添加 窗口 Form4,并在 Form4中添加 listBox控件
在Form4空白处双击,进入Form4_Load(object sender, EventArgs e)函数;

Form4.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WinFormTest2
{public partial class Form4 : Form{public Form4(){InitializeComponent();}private string _name, email_address, topic, option;public string Name{get{return _name;}set{_name = value;}}public string EmailAddress{get{return email_address;}set{email_address = value;}}public string Topic{get { return topic; }set { topic = value; }}public string Option{get { return option; }set { option = value; }}private void Form4_Load(object sender, EventArgs e){      listBox1.Items.Add(_name);listBox1.Items.Add(email_address);listBox1.Items.Add(topic);listBox1.Items.Add(option);        }}
}

在Form2.cs的 button 中 创建窗口Form4实例并设置参数值

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WinFormTest2
{public partial class Form2 : Form{public Form2(){InitializeComponent();}private void Form2_Load(object sender, EventArgs e){textBox1.Text = "";textBox1.Focus();}private void button1_Click(object sender, EventArgs e){if (textBox1.Text == "" || textBox2.Text == ""){MessageBox.Show("姓名或邮箱不能为空", "信息提示");}else{this.Hide();Form4 childForm4 = new Form4();childForm4.Name = textBox1.Text;childForm4.EmailAddress = textBox2.Text;childForm4.Topic = "Topic a";childForm4.Option = "Option a";childForm4.MdiParent = this.MdiParent;childForm4.Show();}}}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916965.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机科学与应用】基于Session欺骗攻击的Web应用程序防护

导读: 本文对Web应用程序开发中的Session欺骗攻击进行了阐述,详细讲解了防范Session欺骗攻击的三种传统方法,并给出了防范代码,分析了三种传统防范方法的不足,新设计了一种通过Referer信息验证来加强对Session欺骗的防…

yolo8+阿里千问图片理解(华为简易版小艺看世界)

✅ 实现目标 按下空格键 → 获取摄像头当前画面; 将图片上传给 大模型 接口,让其“看图说话”; 获取返回描述后,以字幕形式展示在图像画面上; 持续显示识别结果,直到下次按空格。 🧠 需要准…

【ee类保研面试】数学类---线性代数

25保研er,希望将自己的面试复习分享出来,供大家参考 part0—英语类 part1—通信类 part2—信号类 part3—高数类 part100—self项目准备 文章目录线性代数知识点大全**1. 余子式与代数余子式****2. 行列式的含义****3. 矩阵的秩(Rank&#xf…

在 Scintilla 中为 Squirrel 语言设置语法解析器的方法

Scintilla 作为一个强大的开源文本编辑控件,通过配置语法解析器,能够对多种编程语言实现语法高亮、代码折叠等实用功能。若要为新语言 Squirrel 设置语法解析器,可参考以下步骤:​创建 Lexer 源文件:Scintilla 通过 Le…

Go语言核心知识点补充

Go语言核心知识点补充 make函数、for循环与输入处理详解 在前几章的内容中,我们介绍了Go语言的基础语法、变量声明、切片、循环等核心概念。但在实际开发中,一些细节性的知识点往往决定了代码的健壮性与效率。 本文将针对前几章涉及到的变量声明与初始化…

AI服务器中,EEPROM有哪些部件使用,需要存储哪些信息?

在AI服务器中,EEPROM(电可擦可编程只读存储器)主要用于存储关键组件的配置数据、身份信息和校准参数。以下是主要组件及其存储内容: 一、核心组件及存储数据主板(Baseboard Management Controller, BMC) FR…

It学习资源下载

一.UI 8个高质量UI设计网站,灵感收集必备!

Docker Compose :从入门到企业级部署

Docker Compose :从入门到企业级部署1. Docker Compose 核心概念1.1 Compose 架构全景图2. 完整开发工作流2.1 典型开发流程2.2 多服务示例项目结构3. 核心配置详解3.1 服务配置矩阵3.2 网络拓扑示例4. 企业级部署方案4.1 多环境配置管理4.2 扩展部署架构5. 高级技巧…

1.2.vue插值表达式

在 Vue.js 中,插值表达式是用于在模板中显示数据的一种方式。它使用双大括号语法 {{ }} 来包裹需要输出的变量或表达式的值。Vue 会自动将这些表达式的值插入到 HTML 文档中相应的位置。插值表达式基本用法最基本的插值表达式形式就是直接在模板中引用 Vue 实例中的…

Python数据处理基础(学习笔记分享)

Python数据处理入门 常用库学习 numpy NumPy(Numerical Python) 是 Python 中用于高效数值计算的库,核心是提供一个强大的 ndarray​(多维数组)对象,类似于 C/C 中的数组,但支持更丰富的操作&a…

力扣面试150题--颠倒二进制位

Day 89 题目描述思路 二进制的算法,将十进制转化为二进制,有一点需要注意,直接采取库函数转化为二进制再反转会出现问题(这也是为什么我要补0的原因),因为转化过去不满足32位的二进制,前面不会当…

【ResNet50图像分类部署至RK3588】模型训练→转换RKNN→开发板部署

已在GitHub开源与本博客同步的ResNet50v2_RK3588_Classificationt项目,地址:https://github.com/A7bert777/ResNet50v2_RK3588_Classification 详细使用教程,可参考README.md或参考本博客第八章 模型部署 文章目录一、项目回顾二、模型选择介…

C# _泛型

目录 泛型是什么? 泛型的主要优势 创建一个泛型类 泛型方法 泛型是什么? 泛型是通过参数化来实现同一份代码上操作多种数据类型 利用参数类型将参数的类型抽象化 从而实现灵活的复用 总结: 通过泛型可以实现在同一份代码上操作多种数据类型的逻辑 将类和类中的成员定义…

Vue路由钩子完全指南

Vue.js中的路由导航钩子(Navigation Guards)主要用于在路由导航过程中进行拦截和处理,确保访问控制和状态管理。以下是主要分类及使用方法: 1. 全局钩子函数 作用于整个路由实例,需在路由配置外定义: befor…

RAGFlow 登录界面点击登录无反应,控制台报错 502 Bad Gateway 解决方法

遇到的问题 在使用RAGFlow的时候,登录不进去,但是之前能登录。 还出现了输入地址直接进入工作界面,但是进行不了任何操作的bug;以及无法上传文档的问题(其实都是因为没登录)。 登陆界面报错如图显示。 …

数据结构第3问:什么是线性表?

线性表 线性表由具有相同数据类型的n个元素构成,这些元素之间存在一一对应的线性关系。其中n为表长,当n0的时候线性表是一个空表。简单来说,线性表中的元素排列成一条线,每个元素最多有一个直接的前驱和后继(除第一个和…

常见CMS 靶场复现

一、wordpass1.修改模版文件getshell搭建网站登录网站后台更改网站模版的相关文件写入一句话木马凭借路径访问/wp-content/themes/twentyfifteen/404.php/?aphpinfo();2.上传夹带木马的主题getshell外观-->主题-->添加-->上传-->浏览-->安装-->访问木马文件…

Elasticsearch - 倒排索引原理和简易实现

倒排索引的功能设计倒排索引(Inverted Index)是一种高效的数据结构,常用于全文搜索和信息检索系统。它的核心思想是将文档中每个关键字(term)与包含该关键字的文档列表进行映射。以下是实现倒排索引功能的设计步骤和代…

C#开发的Panel里控件拖放例子 - 开源研究系列文章

上次写了Panel的分页滚动控件( C#开发的Panel滚动分页控件(滑动版) - 开源研究系列文章 - Lzhdims Fashion - 博客园 ),但是主要是想写一个Panel里控件拖放的效果,然后分页控件用于Panel里控件的分页。此文这次写的是控件拖放效果…

Thinkph6中常用的验证方式实例

我们在使用thinkphp6中的数据验证时,如果使用不多的话,会经常遇到校验不对,在这个小问题上折腾很多,索引就不用了。我还不如直接写if条件来的迅捷!!下面把常见的校验方法进行一下整理:protected…