简介
因为毕业设计要用到Winform编程,所以计划用一个月的时间学一下,这篇笔记里包含了上机实操和代码理论两个部分,欢迎前来交流~
另:此篇为C#Winform自学合集第三篇,接上篇(二)
使用教材:《C#Winform实践开发教程 》钱哨 + B站
(B站和CSDN是我名誉教授没错了)
开发环境: Visual Studio 2013 Freamwork 4.0
本篇笔记实践代码:
【导入时选择文件-》打开项目—》点击选择.sln文件即可】
内容一览
- 多文档界面MDI处理
————————————正文————————————
0.MDI与SDI的区别
1.定义
SDI——单文档窗口;
MDI——多文档窗口;
2.SDI如何转换为MDI?
一般生成的窗口都是单文档窗口SDI,只有将它的IsMdiContainer属性设置为True才能设置为多文档窗口。
3.实践案例:如何建立一个MDI?
实验目标:
建立一个Form主窗体,并在该主窗体中建立菜单,通过菜单打开其余的子窗体。
实验步骤:
1)设置第一个窗体的属性为:
属性名称 | 属性参数设置 |
---|---|
text | 父窗口 窗体标签名称 |
StartPosition | CenterScreen 窗体居中 |
FormBorderStyle | FixedToolWindow 无最大最小按钮 |
IsMdiContainer | 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
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;
}
}