MDI多文档界面管理

Posted 无乐不作丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MDI多文档界面管理相关的知识,希望对你有一定的参考价值。

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

Form1图片:

 

 

 代码:

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 

        private void menuItem3_Click(object sender, EventArgs e)
        {

            {
                //foreach (Form childrenForm in this.MdiChildren)
                //{
                //    if (childrenForm.Name == "Form2")
                //    {
                //        childrenForm.Visible = true;
                //        childrenForm.Activate();
                //        return;
                //    }
                //}

               int i = OnlyOne("Form2");
                if (i == 0)
                {
                    Form2 Mdichild = new Form2();
                    Mdichild.MdiParent = this;
                    Mdichild.Show();
                   // this.LayoutMdi(MdiLayout.TileHorizontal);
                }
                else
                    return;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void menuItem4_Click(object sender, EventArgs e)
        {
            int a = OnlyOne("Form2");
            if (a == 0)
           
            {
                Form2 MdiChild1 = new Form2();
                MdiChild1.MdiParent = this;
                MdiChild1.Show();
                //this.LayoutMdi(MdiLayout.TileHorizontal);
            }
            else
                return;
        }

        private void menuItem5_Click(object sender, EventArgs e)
        {
            int b = OnlyOne("Form4");
            if (b == 0)
            {
                Form4 MdiChild2 = new Form4();
                MdiChild2.MdiParent = this;
                MdiChild2.Show();
                //this.LayoutMdi(MdiLayout.TileHorizontal);
            }
            else
                return;

        }

      public int OnlyOne(string xx)     //不重复打开mdi窗口整合成一个方法
        {
            
            foreach (Form childrenForm in this.MdiChildren)
            {
                if (childrenForm.Name == xx)
                {
                    childrenForm.Visible = true;
                    childrenForm.Activate();//有这个,from必须要有可焦点的,如textbox,去掉则不用
                    return 1;
                }
            }
            return 0;
        }
    }
}
View Code

 

Form2图片:

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            comboBox1.SelectedIndex = 0;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
                MessageBox.Show("禁止为空", "信息提示");
            else
            {
               // this.Hide();
                Form3 childForm3 = new Form3(this.textBox1.Text,this.comboBox1.SelectedItem.ToString(),this.listBox1.Text);
                childForm3.MdiParent = this.MdiParent;
                childForm3.Show();  

            }
        }
    }
}
View Code

Form3图片:

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form3 : Form
    {
        private string _varname;
        private string _varSubject;
        private string _varFeedBack;
        public Form3(string varName, string varSubject, string varFeedBack)
        {
            InitializeComponent();
            this._varname = varName;
            this._varSubject = varSubject;
            this._varFeedBack = varFeedBack;
            listBox1.Items.Add("姓名:" + _varname);
            listBox1.Items.Add("主题:" + _varSubject);
            listBox1.Items.Add("意见:" + _varFeedBack);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
View Code

Form4图片:

代码:

无特殊功能代码。

 

 

 窗口1的单击事件,得到Form2:

   Form2 Mdichild = new Form2();
   Mdichild.MdiParent = this;    //制定即将打开的Form2对象MdiParent,即Form2对象的MDI父窗口为当前主窗口
   Mdichild.Show();

 

 MDI窗体的排列:

(1)层叠

this.LayoutMdi(MdiLayout.Cascade);

(2)水平平铺

this.LayoutMdi(MdiLayout.TileHorizontal);

(3)垂直平铺

this.LayoutMdi(MdiLayout.TileVertical);

 

 

窗体传值,接受来自Form2的数据信息。

    private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "")
                MessageBox.Show("禁止为空", "信息提示");
            else
            {
               // this.Hide();
                Form3 childForm3 = new Form3(this.textBox1.Text,this.comboBox1.SelectedItem.ToString(),this.listBox1.Text);
                childForm3.MdiParent = this.MdiParent;
                childForm3.Show();  

            }
        }
View Code

 

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

 childForm3.MdiParent = this.MdiParent;

防止重复打开窗口

        private void menuItem3_Click(object sender, EventArgs e)
        {
                 foreach (Form childrenForm in this.MdiChildren)
                {
                    if (childrenForm.Name == "Form2")
                    {
                        childrenForm.Visible = true;
                        childrenForm.Activate();
                        return;
                    }
                }
               Form2 Mdichild = new Form2();
               Mdichild.MdiParent = this;
               Mdichild.Show();

         }
    
View Code

由于每个打开的窗体都可能会用到上面的代码,因此建议将之集成方法后统一调用。

但是要注意return在防止打开窗口中起到的作用,应用到方法中的函数后,return跳不出事件函数,所以采取了如下方法:

 public int OnlyOne(string xx)     //不重复打开mdi窗口整合成一个方法
        {
            
            foreach (Form childrenForm in this.MdiChildren)
            {
                if (childrenForm.Name == xx)
                {
                    childrenForm.Visible = true;
                    childrenForm.Activate();//有这个,from必须要有可焦点的,如textbox,去掉则不用
                    return 1;
                }
            }
            return 0;
        }

如若没有文本框激活焦点,则不用写childrenFrom.Activate();

                                                                                                                                     


2017-12-04  16:56:54

 

以上是关于MDI多文档界面管理的主要内容,如果未能解决你的问题,请参考以下文章

C#学习笔记——MDI窗体(多文档界面)

用qt如何创建多文档界面的应用程序

MDI窗体应用

MDI窗体和窗体之间的操作总结

Delphi,框架与表格。多文档界面是啥?

设置窗体为父窗体