如何在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() );

 

相关文章推荐

单例模式——解决MDI子窗体实例化的问题

机房收费系统进行有一段时间了,但是始终有些历史遗留问题。比如,如何MDI子窗体如何显示在上层的问题和MDI子窗体实例化的问题。         对于如何显示在上层的问题,我这次采用的还是SetPare...

实时错误426 只允许一个MDI窗体

自己在做机房收费系统的时候,调试的时候没有遇到此类错误。但是又一次调试不想再登陆窗口启动,就把启动项设置为了别的窗体,结果再改到Sub main启动,窗体就不能运行了。 错误的表现有两种:第一种是什么...

MDI窗体上放置一个PictureBox

  • 2013年04月24日 21:03
  • 828B
  • 下载

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

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

实例22 设计MDI窗体

  • 2012年11月02日 14:51
  • 25KB
  • 下载

C#创建MDI窗体实例

  • 2016年02月28日 17:08
  • 6.11MB
  • 下载

【机房收费】---(窗体显示) 实时错误426 只允许一个MDI窗体 (二)

前言:      关于窗体显示的问题一开始就遇到了,后来又遇到了,前后原因不一样,但是关于窗体显示的问题即便很小也有必要总结一下,毕竟窗体如果不显示,所有的东西都白费了。      【问题一】 主窗体...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在MDI中使子窗体只保留一个实例
举报原因:
原因补充:

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