一般生成的窗体都属于单文档窗体(SDI),前面的章节使用的就是单文档窗体,只有将单文档窗体的IsMdiContainer属性设置为 True,才可以将其设置为多文档窗体。
多文档窗体的主要属性、方法和事件如下:
1.3.1 建立多文档界面
(1)创建项目并设置主窗体属性
创建一个项目,在属性窗口将主窗体的相关属性设置如下:
(2)添加菜单栏
在工具箱中找到MainMenu控件,这里要注意,默认工具箱中没有该控件,需要在工具箱中鼠标右键选择“选择项”在里面搜索MainMenu,找到后将其添加到工具箱才能使用。
(3)添加子窗口
在解决方案资源管理器鼠标选中项目,右键选择“添加”,选择添加“Windows窗体”,然后双击菜单栏上的选项“子窗口1”,在生成的点击事件中填写代码实现打开的子窗口在主窗口内活动。
private void menuItem5_Click(object sender, EventArgs e)
{
Form2 Mdichild = new Form2();//首先实例化Form2对象,命名为Mdichild
Mdichild.MdiParent=this;
//其次指定即将打开的Form2对象的MdiParent,即Form2对象的MDI父窗口,为当前的主MD窗口
Mdichild.Show();//显示Form2对象的MDI父窗口
}
子窗口2和子窗口3用同样的方法操作即可。
(4)子窗口层叠或平铺设置
若在原来的菜单项点击事件中,再加入this.LayoutMdi(MdiLayout.Cascade);可以实现子窗口层叠分布,效果如图:
若在原来的菜单项点击事件中,再加入this.LayoutMdi(MdiLayout.TileHorizontal);可以实现子窗口层叠分布,效果如图:
若在原来的菜单项点击事件中,再加入this.LayoutMdi(MdiLayout.TileVertical);可以实现子窗口层叠分布,效果如图:
1.3.2 多文档界面的窗口传值
(1)利用窗体参数定义进行传值
创建一个项目,主窗体是多文档界面,另外创建两个子窗体,通过窗体参数,将一个窗体的信息传递给另一个窗体。
第一个子窗体的界面控件布置如图:
按图示设置好相关空间界面的属性。双击该子窗体,进入到代码编辑页面,在该窗体加载时加载界面控件的默认参数。
private void Form2_Load(object sender, EventArgs e)
{
comboBox1.SelectedIndex = 0;
textBox2.Text = "hudcd@163.com";
textBox1.Text = "阿宝";
}
第二个子窗体界面控件布置如下:
改写该窗体的构造函数,实现接收第一个子窗体发送的信息:
private string name;
private string emailId;
private string subject;
private string feedBack;
public Form3(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.name);
listBox1.Items.Add("邮件地址:" + this.emailId);
listBox1.Items.Add("信息主题:" + this.subject);
listBox1.Items.Add("反馈意见:"+this.feedBack);
}
该窗体上的“关闭”按钮的click事件函数如下:
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("感谢您输入的反馈!");
this.Close();
}
现在回到第一个子窗体,双击“发送”按钮进入到代码编辑页面,编辑按钮的click函数,实现将界面上的信息发送给第二个窗口显示出来:
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,
this.comboBox1.SelectedItem.ToString(), this.listBox1.Items[0].ToString());
childForm3.Show();
}
}
(2)如何确保子窗体在转换过程中受MDI主窗体的控制
在第二个子窗口增加一个“返回”的按钮,其click事件函数如下:
private void button2_Click(object sender, EventArgs e)
{
Form2 fm2 = new Form2();
fm2.Show();
this.Close();
}
运行点击“返回”按钮可以发现,返回的第一个子窗体不再受MDI主窗口的控制。同样的,之前通过在第一个子窗体点击“发送”按钮显示出来的第二个子窗口也是没有受MDI主窗口控制。如何实现连个子窗口始终受MDI主窗口控制呢?
这里需要把第一个子窗体的“发送”按钮的click事件函数改为:
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,
this.comboBox1.SelectedItem.ToString(), this.listBox1.Items[0].ToString());
//原来的代码
//childForm3.Show();
//更改后的代码
childForm3.MdiParent = this.MdiParent;
childForm3.Show();
}
}
第二个子窗体的“返回”按钮的click事件函数代码改为:
private void button2_Click(object sender, EventArgs e)
{
Form2 fm2 = new Form2();
//原来的代码
//fm2.Show();
//this.Close();
//更改后的代码
fm2.MdiParent = this.MdiParent;
fm2.Show();
this.Close();
}
(3)防止重复打开窗口
我们多次点击菜单栏上的“反馈表”会重复地创建新的窗口出来,如何防止重复创建窗口呢?
可以通过修改菜单栏“反馈表”条目的click事件函数,增加判断来实现:
private void menuItem2_Click(object sender, EventArgs e)
{
// 直接检测是否已经打开了此MD工窗体
foreach (Form childrenForm in this.MdiChildren)
{
///检测是不是当前子窗体名称
if (childrenForm.Name == "Form2")
{ //是则显示
childrenForm.Visible = true;//并激活该窗体
childrenForm.Activate();
return;
}
}
Form2 Mdichild = new Form2();//首先实例化Form2对象,命名为Mdichild
Mdichild.MdiParent = this;
//其次指定即将打开的Form2对象的MdiParent,即Form2对象的MDI父窗口,为当前的主MD窗口
Mdichild.Show();//显示Form2对象的MDI父窗口
}
(4)通过类的属性进行数据传值
在这里,在第二个子窗口创建一些属性,通过给这些属性赋值来把第一个子窗口的信息传递给第二个子窗口。
在第二个子窗口增加的属性如下:
//建立私有变量
private string some_name,email_address, topic, option;
//属性“姓名”
public string SomeName
{
get
{
return some_name;
}
set
{
some_name=value;
}
}
//属性“电子邮件”
public string Someemail
{
get
{
return email_address;
}
set
{
email_address =value;
}
}
//属性“主题”
public string Sometopic
{
get
{
return topic;
}
set
{
topic = value;
}
}
//属性“意见”
public string Someoption
{
get
{
return option;
}
set
{
option = value;
}
}
双击第二个子窗口界面,进入到代码编辑页面,在第二个子窗口加载时,将增加的属性加载到界面显示出来:
private void Form3_Load(object sender, EventArgs e)
{
listBox1.Items.Add(SomeName);
listBox1.Items.Add(Someemail);
listBox1.Items.Add(Sometopic);
listBox1.Items.Add(Someoption);
}
由于传递信息的方式变了,所以在第一个子窗口点击“发送”按钮时的click事件的函数也需要修改:
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text==""||textBox2.Text=="")
{
MessageBox.Show("姓名或者邮件信息禁止为空!信息提示你掌哪案");
}
else
{
this.Hide();
Form3 childForm3 = new Form3();
childForm3.SomeName = textBox1.Text;
childForm3.Someemail = textBox2.Text;
childForm3.Sometopic = comboBox1.SelectedItem.ToString();
childForm3.Someoption = listBox1.Items[0].ToString();
childForm3.MdiParent = this.MdiParent;
childForm3.Show();
}
}
本章节例程:winform实战教程Demo_1_3

暂无评论内容