如何在MDI中使子窗体只保留一个实例

原创 2006年05月17日 11:28:00

由于在MDI中,子窗体会很多,那么在我以前一篇文章中所提到的方法就有些繁琐了。为了能适应多个子窗体,并对于每个子窗体只保留一个实例,那么我就用一个新的方法来替换,即用反射方法来作处理。

 

大致代码如下。

首先是通过子窗体类型名来判断是否打开新的子窗体,还是把原有的子窗体进行显示。

    using System.Reflection;

    /// <summary>

    /// Open child window

    /// </summary>

    /// <param name="ChildTypeString"></param>

    private void OpenWindow( string ChildTypeString )

    {

        Form myChild = null;

        if( !ContainMDIChild( ChildTypeString ) )

        {

            // Get current process assembly

            Assembly assembly = Assembly.GetExecutingAssembly();

 

            // Create data type using type string

            Type typForm = assembly.GetType( ChildTypeString );

 

            // Create object using type's "InvokeMember" method

            Object obj = typForm.InvokeMember(

                null,

                BindingFlags.DeclaredOnly |

                BindingFlags.Public | BindingFlags.NonPublic |

                BindingFlags.Instance | BindingFlags.CreateInstance,

                null,

                null,

                null );

 

            // Show child form

            if( obj != null )

            {

                myChild = obj as Form;

                myChild.MdiParent = this;

                myChild.Show();

                myChild.Focus();

            }

        }

    }

 

    /// <summary>

    /// Search mdi child form by specific type string

    /// </summary>

    /// <param name="ChildTypeString"></param>

    /// <returns></returns>

    private bool ContainMDIChild( string ChildTypeString )

    {

        Form myMDIChild = null;

        foreach(Form f in this.MdiChildren)

        {

            if( f.GetType().ToString() == ChildTypeString )

            {

                // found it

                myMDIChild = f;

                break;

            }

        }

 

        // Show the exist form

        if( myMDIChild != null)

        {

            myMDIChild.TopMost = true;

            myMDIChild.Show();

            myMDIChild.Focus();

            return true;

        }

        else

            return false;

    }

 

以上两部分就可以对于每个子窗体只创建一个实例。那么调用以上代码就非常简单了。

如:

    //Open a mdi child form which type named "MDIChild"

    OpenWindow( typeof( MDIChild ).ToString() );

 

WPF实现类似MDI子窗体的功能

在我的上一篇博客中 http://blog.csdn.net/soft2buy/article/details/5479946,提到了用UserControl做为WPF的“MDI子窗体”。今天偶然发现...
  • soft2buy
  • soft2buy
  • 2013年11月12日 17:06
  • 10819

DELPHI中MDI子窗口的关闭 和打开

Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会发觉该子窗口只是最小化,而不是你预期的那样被关闭。解决办法是在子窗口的OnClose事件处理过程中加入如...
  • wozengcong
  • wozengcong
  • 2015年01月24日 23:26
  • 3482

C# Winform MDI窗体,父窗体控件覆盖子窗体的解决办法

问题:MDI窗体中,父窗体控件会覆盖子窗体,网上很多解决方案表面上解决了问题,但失去了MDI窗体的基本特性,并不实用。比较赞成使用子窗体“代替”父窗体控件的方案。思路:不将控件放置在父窗体上,而是放在...
  • lj22377
  • lj22377
  • 2015年09月14日 15:37
  • 2223

C#-Mdi多文档窗口及其子窗口的排列 ---ShinePans

MdiLayout枚举成员及说明 Casecade s所有Mdi层叠在父窗口 TileHorizontal 水平平铺 TitleVertical 垂直平铺 Form...
  • panshang1994
  • panshang1994
  • 2014年04月20日 15:03
  • 3286

VB.NET章鱼哥出品—如何解决MDI子窗体被父窗体中的控件覆盖的问题

最近有个网友问我这个问题,我就上网搜了下,结果很失望,有几个在CSDN上发的求助帖,看到最后都没有找到明确的答案。这里笔者在网上找到了API函数SetParent(),并对网上的错误进行了修改,并给出...
  • zhangyubishoulin
  • zhangyubishoulin
  • 2014年11月06日 06:40
  • 2279

C#MDI打开子窗体去掉自动生成的菜单栏

C#在DMI中打开子窗体时自动生成了菜单栏,怎么去掉菜单栏呢呢? 先在父窗体的加载事件中打开子窗体并使它最大化 private void MDIParent1_Load(object send...
  • shiyangkai
  • shiyangkai
  • 2017年05月09日 16:00
  • 820

C#解决MDI窗体闪屏的方法 --(arvin推荐)

来自:http://im17me.blog.163.com/blog/static/1378992752012927356432/ 最近从师兄手上接了一个C#的项目,需要用到MDI窗体,可是每当我显...
  • ArvinStudy
  • ArvinStudy
  • 2013年06月26日 23:04
  • 927

vb.net详解MDI窗体操作方法

MDI窗体可以避免打开窗体的时候被无数个子窗体困扰,我将为大家一一的介绍一下vb.net中MDI窗体的操作方法 一、如何创建MDI窗体? 1、创建mdi主窗体 新建建立一个默认空白的Window...
  • jin870132690
  • jin870132690
  • 2014年11月29日 16:59
  • 3752

子窗子显示在MDI主窗体panel控件之上

机房收费系统中,需要将子窗子显示在MDI主窗体panel容器控件之上。查了资料。大概网上有两种方法。一种是是可以将子窗体上的控件直接内嵌到panel控件之上,还有一种是子窗子显示在MDI主窗体pane...
  • suneqing
  • suneqing
  • 2014年02月15日 14:25
  • 2950

C#之WinForm基础 设置某一个窗体为MDI的父窗体

慈心积善融学习,技术愿为有情学。善心速造多好事,前人栽树后乘凉。我今于此写经验,愿见文者得启发。 1、解决方案资源管理器展示。   我多添加了一个窗体,Form2 2、未...
  • yushaopu
  • yushaopu
  • 2016年09月17日 18:41
  • 3556
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在MDI中使子窗体只保留一个实例
举报原因:
原因补充:

(最多只允许输入30个字)