winform 实战教程——1.3 多文档界面(MDI)

        一般生成的窗体都属于单文档窗体(SDI),前面的章节使用的就是单文档窗体,只有将单文档窗体的IsMdiContainer属性设置为 True,才可以将其设置为多文档窗体。

多文档窗体的主要属性、方法和事件如下:

1_3_1_1

 

1.3.1 建立多文档界面

(1)创建项目并设置主窗体属性

创建一个项目,在属性窗口将主窗体的相关属性设置如下:

1_3_1_2

(2)添加菜单栏

      在工具箱中找到MainMenu控件,这里要注意,默认工具箱中没有该控件,需要在工具箱中鼠标右键选择“选择项”在里面搜索MainMenu,找到后将其添加到工具箱才能使用。

1_3_1_3

(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);可以实现子窗口层叠分布,效果如图:

1_3_1_4

        若在原来的菜单项点击事件中,再加入this.LayoutMdi(MdiLayout.TileHorizontal);可以实现子窗口层叠分布,效果如图:

1_3_1_5

        若在原来的菜单项点击事件中,再加入this.LayoutMdi(MdiLayout.TileVertical);可以实现子窗口层叠分布,效果如图:

1_3_1_6

 

1.3.2 多文档界面的窗口传值

(1)利用窗体参数定义进行传值

        创建一个项目,主窗体是多文档界面,另外创建两个子窗体,通过窗体参数,将一个窗体的信息传递给另一个窗体。

第一个子窗体的界面控件布置如图:

1_3_1_7

        按图示设置好相关空间界面的属性。双击该子窗体,进入到代码编辑页面,在该窗体加载时加载界面控件的默认参数。

private void Form2_Load(object sender, EventArgs e)
{
    comboBox1.SelectedIndex = 0;
    textBox2.Text = "hudcd@163.com";
    textBox1.Text = "阿宝";
}

第二个子窗体界面控件布置如下:

1_3_1_8

改写该窗体的构造函数,实现接收第一个子窗体发送的信息:

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主窗口控制呢?

1_3_1_9

这里需要把第一个子窗体的“发送”按钮的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)防止重复打开窗口

我们多次点击菜单栏上的“反馈表”会重复地创建新的窗口出来,如何防止重复创建窗口呢?

1_3_1_10

可以通过修改菜单栏“反馈表”条目的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

我也是有底线哒~
© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容