首页 | IT新闻 | 硬件 | 操作系统 | 开发 | 网络编程 | 数据库 | 热门框架 | 网络安全 | 组网 | 建站指南 | 网页制作 | 特效 | 实用技巧 | 服务器 | 办公 | QQ | 探索 | 社区

  • 技术部落
  • 部落首页 > 程序开发 > C/C#/C++ > 正文
  • 如何在MDI中使子窗体只保留一个实例
      2007-10-15  来源:CSDN  编辑:Jsbulo  热度:

      由于在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() );