惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
罗磊的独立博客
博客园 - 【当耐特】
D
Docker
Y
Y Combinator Blog
L
LangChain Blog
博客园 - 三生石上(FineUI控件)
I
InfoQ
阮一峰的网络日志
阮一峰的网络日志
F
Fortinet All Blogs
J
Java Code Geeks
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
B
Blog
The GitHub Blog
The GitHub Blog
腾讯CDC
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
爱范儿
爱范儿
A
About on SuperTechFans
量子位
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC

博客园 - 青弦

WinForm打印之页边距 [转载]交换的概念和原理 [转载]交换机概述 [转载]笑傲江湖之三层交换篇 [转载]Window.Open()网页弹出窗口大全 [转载]详解HTML中的META标签 [转载]网页滚动条特效 VS2005中TableAdapter中实现动态查询并使用LIKE的方法整理 去除MDI子窗体最大化后在MainMenuStrip上自动产生的最大化等按钮 第一次认真画用例图,错误很多,请大家来指点 代码段,你用了吗? DIV的水平、垂直居中的最佳实现 Excel数字、文本混合列导入SQL Server出现的问题&解决办法 SQL Server 2000导入数据时遇到的问题 不逐流俗,独辟蹊径——另类又好用的软件推荐[不断更新……] Winform中全屏显示问题 [资源]在线工具测试网页载入速度 博客园blog模板CSS自定义美化 达摩克利斯之刃——.NET破解技术初探
[转载]如何在MDI中使子窗体只保留一个实例(反射方法)
青弦 · 2008-08-21 · via 博客园 - 青弦

出处:http://dev.csdn.net/author/Knight94/acd529d8a91a42f6ba5996babf1395d4.html

作者:愚翁 

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

 1/// <summary>
 2/// Open child window
 3/// </summary>
 4/// <param name="ChildTypeString"></param>

 5private void OpenWindow(string ChildTypeString)
 6{
 7   Form myChild = null;
 8   if (!ContainMDIChild(ChildTypeString))
 9   {
10      // Get current process assembly
11      Assembly assembly = Assembly.GetExecutingAssembly();
12
13      // Create data type using type string
14      Type typForm = assembly.GetType(ChildTypeString);
15
16      // Create object using type's "InvokeMember" method
17      Object obj = typForm.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, nullnullnull);
18
19      // Show child form 
20      if (obj != null)
21      {
22         myChild = obj as Form;
23         myChild.MdiParent = this;
24         myChild.Show();
25         myChild.Focus();
26      }

27   }

28}

29
30/// <summary>
31/// Search mdi child form by specific type string
32/// </summary>
33/// <param name="ChildTypeString"></param>
34/// <returns><eturns>

35private bool ContainMDIChild(string ChildTypeString)
36{
37   Form myMDIChild = null;
38   foreach (Form f in this.MdiChildren)
39   {
40      if (f.GetType().ToString() == ChildTypeString)
41      {
42         // found it 
43         myMDIChild = f;
44         break;
45      }

46   }

47
48   // Show the exist form
49   if (myMDIChild != null)
50   {
51      myMDIChild.TopMost = true;
52      myMDIChild.Show();
53      myMDIChild.Focus();
54      return true;
55   }

56   else
57      return false;
58}

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

如:

//Open a mdi child form which type named "MDIChild"
OpenWindow( typeof( MDIChild ).ToString() );

点评:个人认为这种方法要优于其它网上可找到的方法,通过使用反射技术使代码得到进一步重构,更加简洁。有一点小小的意见就是,其中的OpenWindow方法其名称改为ShowWindow似乎更恰当一些。 ——by青弦