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;
        }
    }
}

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();  

            }
        }
    }
}

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();
        }
    }
}

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();  

            }
        }

确保子窗体在转换的过程中受到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();

         }
    

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

但是要注意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

时间: 2024-10-08 16:54:51

MDI多文档界面管理的相关文章

C# Winfrom MDI(多文档界面)

1.首先设置父级Form1界面,只需要将该界面的IsMdiContainer属性设置为true: 2.设置按钮的事件来打开子级的窗口Form2,Form3等等: 3.在From1内设置一个容器panel,范围为需要打开的子级界面的大小: 4.设置Form2.Form3的事件,以及唯一窗口等: //Form2的点击事件 private void form2ToolStripMenuItem_Click(object sender, EventArgs e) { Form2 f2 = new For

设计一个多文档界面(MDI)应用程序,可以实现打开、排列和关闭子窗口。

首先 :我们要知道什么是多文档界面(MDI) 理论上说是"在多文档窗口环境下进行开发设计的,这种多文档界面称为多文档界面(mdi)" 通俗 的一点,我们最常见到的Excel表格就是mdi [我个人理解的图是这样的] 开始实际操作: 1.打开2个窗体[Form2为主窗体,Form2_son为子窗体] 2.在主窗体Form2中拖拉控件 MenuStrip(菜单栏) 设置form2的IsMdiContainer=True 3.在子窗体Form2_son中拖拉控件 RichTextBox  (

Qt多文档界面应用设计

使用Qt编写多文档界面(MDI)应用相当方便,主要会使用到QMdiArea和QMdiSubWindow两个类.可以查看Qt Asistant中这两个类的说明文档,里面介绍的相当详细.另外,可以搜索例程"Mdi Example",这是提供的一个示例程序,这是一个多文档编辑器,代码很详细,只是缺少注释,不过很简单,应该容易看懂.接下来,我在这里介绍最简单.最精华的部分. 1 QMdiArea 这个类相当于一个MDI窗口管理器,用来管理添加到这个区域中的多个子窗口.我们在应用中新建的所有子窗

【Windows编程】系列第十一篇:多文档界面框架

前面我们所举的例子中都是单文档界面框架,也就是说这个窗口里面的客户区就是一个文档界面,可以编写程序在里面输入或者绘制文本和图形输出,但是不能有出现多个文档的情况.比如下面的UltraEdit就是一个典型的多文档界面,他可以同时编辑多个文档,每个文档还可以最大化,最小化等等,我们今天就来看看多文档的基本框架是怎么实现的. 多文档界面的框架创建需要几下几步. 主框架窗口创建 主框架窗的创建跟普通的窗口没有什么区别,就是自己注册一个类并用该类创建一个重叠窗口,这个可以用CreateWindow/Cre

多文档界面的实现(DotNetBar的superTabControl)

private void FormMain_Load(object sender, EventArgs e) { superTabControl2.Tabs.Clear(); timer1.Start(); buttonX1_Click(null, null); } /// <summary> /// 创建或者显示一个多文档界面 /// </summary> /// <param name="caption">窗体标题</param> /

Mobox企业网盘文档权限管理的技术实现

文档权限管理是企业数据归档存储的重要保护手段,企业网盘Mobox是一款带权限操作限制的系统, 技术实现原理 1.分级分权管理 系统管理员来创建文档柜 (文档柜可以设置管理员) 文档柜管理员,进入自己的文档柜,可以在下面继续创建目录.(可以给目录设置目录管理员) 目录管理员,可以进入自己的目录,进行下一步的数据录入及管理工作 2.权限建设 任何目录都能设置: 1)可见   (这个文档柜或目录能看到) 2)开展开  (这个文档柜或目录的下层结构能展看) 3)上传 (在这个文档柜或目录下面能上传文件)

多文档界面QMdiArea

当使用多文档界面功能时,我们是将QMdiArea作为主窗口的中央部件,然后在这个中央部件中,我们可以同时打开很多个子窗口QMdiSubWindow 样式: 1 import sys 2 from PyQt5.QtGui import QIcon 3 from PyQt5.QtWidgets import QApplication, QMainWindow, QMdiArea, QMdiSubWindow, QAction, QTextEdit 4 5 6 class Demo(QMainWind

【软件工程】 文档 - 银行业务管理 - 需求分析

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 软件工程 银行业务管理和现金结算系统 ---

第19章 多文档界面

19.1 概述——MDI层次结构 ①框架窗口 A.本身是一个普通的主窗口,其客户区被特殊的窗口覆盖,并不直接显示程序的输出.其客户区也被称为“工作区” B.默认的消息处理函数是DefFrameProc,而不是DefWindowProc. ②客户窗口: A.系统预定义的窗口类,类名“MDICLIENT”,负责各个MDI子窗口的管理. B.窗口过程系统己经预先注册,用户程序不需要窗口过程. ③文档窗口:也称为子窗口,用于显示一个文档. 19.2 窗口的建立 (1)框架窗口:先注册一个MDI框架窗口类