【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
英文地址,請注明出處:http://en.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…