2023年12月6日发(作者:)

C#Winform编程自学笔记(三)多文档界面处理MDI

简介

因为毕业设计要用到Winform编程,所以计划用一个月的时间学一下,这篇笔记里包含了上机实操和代码理论两个部分,欢迎前来交

流~

另:此篇为C#Winform自学合集第三篇,接上篇(二)

使用教材:《C#Winform实践开发教程 》钱哨 + B站

(B站和CSDN是我名誉教授没错了)

开发环境: Visual Studio 2013 Freamwork 4.0

本篇笔记实践代码:

【导入时选择文件-》打开项目—》点击选择.sln文件即可】

内容一览

1. 多文档界面MDI处理

————————————正文————————————

与SDI的区别

1.定义

SDI——单文档窗口;

MDI——多文档窗口;

如何转换为MDI?

一般生成的窗口都是单文档窗口SDI,只有将它的IsMdiContainer属性设置为True才能设置为多文档窗口。

3.实践案例:如何建立一个MDI?

实验目标:

建立一个Form主窗体,并在该主窗体中建立菜单,通过菜单打开其余的子窗体。

实验步骤:

1)设置第一个窗体的属性为:

属性名称

text

StartPosition

FormBorderStyle

IsMdiContainer

属性参数设置

父窗口 窗体标签名称

CenterScreen 窗体居中

FixedToolWindow 无最大最小按钮

True 设置为MDI窗口

2)为该MDI窗体配置MainMenu菜单,工具箱默认没有该控件,打开工具箱的所有Windows控件部分,右击工具箱界面,在打开的菜单中

选择“选择项”命令,并在展开的“选择工具箱项”窗口中找到MainMenu菜单控件,添加后即出现在Windows的控件部分。

3)打开解决方案资源管理器,新建一个windows窗体,命名为Form2,该窗体非MDI窗体,双击父窗口菜单中的“子窗口1项目”,对源

代码进行编辑:

private void menuItem2_Click(object sender, EventArgs e)

{

Form2 Mdichild = new Form2();//

实例化

Form2

对象,并命名为

mdichild

ent = this;

//

其次指定即将打开的

Form2

窗体的父窗体

();//

显示

Form2

对象的父窗口

}

为“儿选项”指定窗口:

FormX Mdichild =new FormX();

为“儿窗口”指定父窗口:

ent = this;

4)此时,打开的From2窗口就只能在父窗口下活动,而不会超出父窗口的范围。按照此方法再建立两个窗体,命名为Form3和Form4,并

可以通过单击“子窗口2”和"子窗口3”菜单来打开它们。

实验结果:

单击文件,会显示三个选项,子窗口1,子窗口2,子窗口3,单击选择子窗口1,出现以下界面;且大娃只能在父亲范围活动;

窗体的排列

4.1 层叠

在主窗体中对MDI窗体的层叠操作是通过LayoutMdi来实现的,其参数为e。在原有的menuItem3_Click实践中添加

MDI窗体的层叠源代码如下:

4.2 水平

也是通过LayouMdi方法,此时的参数是rizontal

4.3 垂直

多文档界面的窗体传值技术

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

对新打开的窗口进行重载,改变参数之后就可以在打开这个窗口的时候把数据传进去。

实验目标:

建立一个MDI主窗体和两个子窗体,并实现打开某个窗体并录入信息后,可以将信息显示在另一个窗体中。

实验步骤:

1)在多文档的建立案例基础上,单击“窗口1”菜单项打开一个子窗口(我选择的是Form3,也就是第二个),对这个子窗口进行编辑

(参考下面实验结果中的效果图),同时新建立一个窗口,我为它命名为Form5,用以接收从Form3中传来的信息。

对Form3的加载源码做出以下编辑:

private void Form3_Load(object sender, EventArgs e)

{

edIndex = 0;

= " ";

();

}

2)在新建立的窗口Form5中,建立相应的空间以接收来自Form3的数据信息。回到表单窗体Form3,双击“发送”按钮,就将用户填写的

信息发送给form5.

这是“发送”按钮的源码:

private void button1_Click(object sender, EventArgs e)

{

if(==" " ||==" ")

{

("姓名和邮箱不能为空", "信息提示");

}

else

{

();

Form5 childForm7 = new Form5(, , ng(),);

();

}

}

(); //隐藏当前窗口

//传参,非常重要,需要对Form5进行设置

Form5 childForm7 = new Form5(, ,

ng(),);

(); //显示form5窗口

这是对From5的重新编辑:

public partial class Form5 : Form

{

private string _name;

private string _emailId;

private string _subject;

private string _feedBack;

public Form5(string varName,string varEmail,string varSubject,string varFeedBack)

{

InitializeComponent();

this._name = varName;

this._emailId = varEmail;

this._subject = varSubject;

this._feedBack = varFeedBack;

("姓名: " + this._emailId);

("邮件地址:" + this._emailId);

("信息主题:" + this._subject);

("反馈意见:" + this._feedBack);

}

private void Form5_Load(object sender, EventArgs e)

{

}

private void button1_Click(object sender, EventArgs e)

{

("感谢您的信息!");

();

}

}

实验结果:

5.2 如何确保子窗体在转换的过程中受到MDI主窗口的控制

实验步骤:

1)在form5添加一个“返回”按钮,并对其源码做安排如下:

使得在单击返回按钮时,能够直接返回原窗口。

private void button2_Click(object sender, EventArgs e)

{

Form3 fm3 = new Form3();

();

();

}

2)后面实验太简单,不写了,就是将新打开的窗体的父窗体统一成它爸爸的窗体,统一为一个父窗体的时候,就都受一个老祖宗控制了。

5.3 如何防止重复打开窗口 教材P29

在要打开的窗口中加上

foreach(From childForm in this,MdiChildren)

{

if(=="Formccl")

{

e=true;

te();

return;

}

}