本文转载:http://www.cnblogs.com/Ricky81317/archive/2008/09/17/1292443.html

看到论坛中有朋友问,如何可以保证在MDI主窗体中,同一类型的子窗体只能打开一次,再打开只是将原来打开的窗体激活。这个要求我以前写程序的时候也遇到过。我实现的基本思路是:

一般每个子窗体都是继承自Form类型,不同子窗体分别代表不同的功能,因此只需要判断当前MDI打开的子窗体的类型中有没有当前需要打开的子窗体类型就行了,如果有,则直接激活,如果没有则创建一个并加到主窗体中。具体实现起来有很多种办法,这里只写出一个利用泛型的实现:

/// <summary>
/// 打开MDI子窗口并附加到MDI主窗口中,如果MDI主窗口中已经存在相同类型的子窗口,则直接激活
/// </summary>
/// <typeparam name="T">MDI子窗体类型</typeparam>
/// <param name="mdiParent">MDI主窗体引用</param>
/// <returns>当前创建或得到的MDI子窗体类型实例的引用</returns>
private T OpenUniqueMDIChildWindow<T>(Form mdiParent) where T : Form, new()
{
    foreach (Form subForm in mdiParent.MdiChildren)
    {
        if (subForm.GetType().Equals(typeof(T)))
        {
            subForm.Activate();
            return subForm as T;
        }
    }
    T newForm = new T();
    newForm.MdiParent = mdiParent;
    newForm.Show();
    return newForm;
}

这个方法可以放在你的菜单项的单击事件处理方法中。
比如你想单击About菜单项,打开一个AboutForm类型的窗体,那么就:
OpenUniqueMDIChildWindow<AboutForm>(this)
看代码的话,你会发现,如果About窗体已经被打开过的话,会自动激活那个窗体,如果没有,那么它会自己new一个出来,不需要你手工创建。

保证相同类型的MDI子窗体只会被打开一次的方法的更多相关文章

  1. Delphi中实现MDI子窗体(转)

        Delphi中实现MDI子窗体 用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容  ① 多文档窗体(MDI) MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一 ...

  2. 用DLL方式封装MDI子窗体

    用DLL方式封装MDI子窗体是一种常用的软件研发技术,他的长处: 研发人员能够负责某一个模块的编写包括(界面+逻辑),能够互不干扰,模块研发完成后,主程式统一调用. 易于程式升级,当程式升级时,不用编 ...

  3. 解决WinForm(C#)中MDI子窗体最大化的问题

    “用MDI方式打开一个子窗口体后,总是不能最大化显示,明明子窗口体的WindowState设置为Maximized?”,相信有很多人会遇到这的样问题,请按下面的方法设置即可使MDI子窗体最大化: 1. ...

  4. 在DLL动态链接库中封装VCL的MDI子窗体

    在DLL动态链接库中封装VCL的MDI子窗体不多说了,看代码就应该明白了,曾经我遇到的问题,现在放出来大家共享! 这里是工程文件的部分: 在DLL中封装MDI子窗体需要重写DLL入口函数,具体代码如下 ...

  5. Delphi MDI 子窗体的创建和销毁 [zhuan]

    1.如果要创建一个mdi child,先看是否有这个child 存在,如果有,则用它,如果没有再创建 //该函数判断MDI 子窗体是否存在,再进行创建和显示function isInclude(for ...

  6. C# Winform 防止MDI子窗体重复打开

    可以在MDI主窗体中添加以下方法. //防止打开多个窗体 private bool ShowChildrenForm(string p_ChildrenFormText) { int i; //依次检 ...

  7. 解决WinForm(C#)中MDI子窗体最大化跑偏的问题

    “用MDI方式打开一个子窗口体后,总是不能最大化显示,明明子窗口体的WindowState设置为Maximized?”,相信有很多人会遇到这的样问题,请按下面的方法设置即可使MDI子窗体最大化: 1. ...

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

    DELPHI中MDI子窗口的关闭 和打开       Delphi中MDI子窗口的关闭方式默认为缩小而不是关闭,所以当你单击子窗口右上角的关闭按钮时会   发觉该子窗口只是最小化,而不是你预期的那样被 ...

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

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

随机推荐

  1. line-height行高使用技巧

    若父元素标签高度一定,假设为150px,子元素需要垂直居中,再重新给子元素设置一个行高就好了,省事省力

  2. 怎样让老浏览器兼容html5新标签

    CSS样式设置默认样式: <style> article, aside, canvas, details, figcaption, figure, footer, header, hgro ...

  3. 禁用微信 webview 调整字体大小

    原文:http://www.grycheng.com/?p=2411 微信 webview 内置了调整字体大小的功能,对于网页的可用性来说是一个很实用的功能.一些网页的字体设置过小导致用户看不清文字, ...

  4. ServletContext全局变量初始化

    Java部分 package com.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.ser ...

  5. iOS网络

    iOS开发系列--网络开发 2014-10-22 08:34 by KenshinCui, 1253 阅读, 19 评论, 收藏,  编辑 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微 ...

  6. 浅析Linux操作系统工作的基础

    环境:lubuntu 13.04   kernel 3.9.7 作者:SA12226265 katao 简介: 本文根据 Linux™ 系统工作基础的分析,对存储程序计算机.堆栈(函数调用堆栈)机制和 ...

  7. 【Database】MongoDB教程

    MongoDB是一个基于分布式文件存储的数据库.旨在为WEB应用提供可扩展的高性能数据存储解决方案.

  8. java or spring +jython +python (Error:python.home,Determine if the following attributes are correct:)

    最近更新 :16年3月10日更 首先你在用JAVA,你需要运行Python,于是你找了Jython,我不介绍什么是Jythyon了 如何在Java中调用Python的方法,一百度一大堆, 如下:是一种 ...

  9. RemixOS Player 让用户在 Windows 上运行 Android App

    http://www.oschina.net/news/77154/remixos-player-windows-andriod-app

  10. sublime sftp 插件安装及破解

    必备插件sftp: 1,Package Control可以用来install其他package 2,sftp远程编辑文件:安装:install->sftp具体配置 sftp工具破解     1, ...