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

简介

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

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

使用教材:《C#Winform实践开发教程 》钱哨 + B站
(B站和CSDN是我名誉教授没错了)
开发环境: Visual Studio 2013 Freamwork 4.0

本篇笔记实践代码:

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

内容一览

  1. 多文档界面MDI处理

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

0.MDI与SDI的区别

1.定义

SDI——单文档窗口;
MDI——多文档窗口;

2.SDI如何转换为MDI?

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

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

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

实验步骤:
1)设置第一个窗体的属性为:

属性名称属性参数设置
text父窗口 窗体标签名称
StartPositionCenterScreen 窗体居中
FormBorderStyleFixedToolWindow 无最大最小按钮
IsMdiContainerTrue 设置为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
            Mdichild.MdiParent = this;
            //其次指定即将打开的Form2窗体的父窗体
            Mdichild.Show();//显示Form2对象的父窗口
        }

为“儿选项”指定窗口:
FormX Mdichild =new FormX();
为“儿窗口”指定父窗口:
Mdichild.MdiParent = this;

4)此时,打开的From2窗口就只能在父窗口下活动,而不会超出父窗口的范围。按照此方法再建立两个窗体,命名为Form3和Form4,并可以通过单击“子窗口2”和"子窗口3”菜单来打开它们。

实验结果:
单击文件,会显示三个选项,子窗口1,子窗口2,子窗口3,单击选择子窗口1,出现以下界面;且大娃只能在父亲范围活动;
在这里插入图片描述
在这里插入图片描述

4.MDI窗体的排列

4.1 层叠

在主窗体中对MDI窗体的层叠操作是通过LayoutMdi来实现的,其参数为MdiLayout.Cascade。在原有的menuItem3_Click实践中添加MDI窗体的层叠源代码如下:
在这里插入图片描述

4.2 水平

也是通过LayouMdi方法,此时的参数是MdiLayout.TileHorizontal
在这里插入图片描述

4.3 垂直

在这里插入图片描述

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

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

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

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

实验步骤:
1)在多文档的建立案例基础上,单击“窗口1”菜单项打开一个子窗口(我选择的是Form3,也就是第二个),对这个子窗口进行编辑(参考下面实验结果中的效果图),同时新建立一个窗口,我为它命名为Form5,用以接收从Form3中传来的信息。

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

private void Form3_Load(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = 0;
            textBox1.Text = " ";
            textBox1.Focus();
        }

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

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

 private void button1_Click(object sender, EventArgs e)
        {
            if(textBox1.Text==" " ||textBox2.Text==" ")
            {
                MessageBox.Show("姓名和邮箱不能为空", "信息提示");
            }
            else
            {
                this.Hide();
                Form5 childForm7 = new Form5(this.textBox1.Text, this.textBox2.Text, this.comboBox1.SelectedItem.ToString(),this.textBox3.Text);
                childForm7.Show();
            }
        }

this.Hide(); //隐藏当前窗口
//传参,非常重要,需要对Form5进行设置
Form5 childForm7 = new Form5(this.textBox1.Text, this.textBox2.Text, this.comboBox1.SelectedItem.ToString(),this.textBox3.Text);
childForm7.Show(); //显示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;

   listBox1.Items.Add("姓名: " + this._emailId);
            listBox1.Items.Add("邮件地址:" + this._emailId);
            listBox1.Items.Add("信息主题:" + this._subject);
            listBox1.Items.Add("反馈意见:" + this._feedBack);

   }

 private void Form5_Load(object sender, EventArgs e)
        {

   }

private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("感谢您的信息!");
            this.Close();
        }
    }

实验结果:
在这里插入图片描述
在这里插入图片描述

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

实验步骤:
1)在form5添加一个“返回”按钮,并对其源码做安排如下:
使得在单击返回按钮时,能够直接返回原窗口。

 private void button2_Click(object sender, EventArgs e)
        {
            Form3 fm3 = new Form3();
            fm3.Show();
            this.Close();
        }

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

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

在要打开的窗口中加上

foreach(From childForm in this,MdiChildren)
{
	if(childrenForm.Name=="Formccl")
	{
		childrenForm.Visible=true;
		childrenForm.Activate();
		return;
	}
}
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值