关于Winform程序窗体间的跳转问题:

对于编程新手来讲,winform程序窗体间的跳转,经常会出现一些异常,或是弹出重复的窗口,如下图

下面给出一种方法,可以很好的避免掉这样的问题:
首先,在主程序Program中,定义一个“找窗体或是创建窗体”的方法,见以下代码:

 1 namespace FormJump
 2 {
 3     static class Program
 4     {
 5         public static List<Form> formList = new List<Form>();
 6         /// <summary>
 7         /// 找窗体或创建窗体的方法
 8         /// </summary>
 9         /// <param name="type"></param>
10         /// <returns></returns>
11         internal static Form FindOrCreateFrom(Type type)
12         {
13             Form form = null;
14             foreach (Form formItem in Program.formList)
15             {
16                 if (formItem.GetType() == type)
17                 {
18                     form = formItem;
19                     form.Activate();
20                     break;
21                 }
22             }
23             if (form == null)
24             {
25                 object obj = Activator.CreateInstance(type);
26                 if (obj is Form)
27                 {
28                     form = obj as Form;
29                     form.Show();
30                 }
31             }
32             return form;
33         }
34         /// <summary>
35         /// 应用程序的主入口点。
36         /// </summary>
37         [STAThread]
38         static void Main()
39         {
40             Application.EnableVisualStyles();
41             Application.SetCompatibleTextRenderingDefault(false);
42             Application.Run(new FrmMain());
43         }
44     }
45 }

然后添加一个FrmChild的子窗体,编写一个加载和关闭窗体的方法,见以下代码:

 1 namespace FormJump
 2 {
 3     public partial class FrmChild : Form
 4     {
 5         public FrmChild()
 6         {
 7             this.Load += new EventHandler(FrmChild_Load);
 8             this.FormClosed += new FormClosedEventHandler(FrmChild_FormClosed);
 9         }
10         public void FrmChild_Load(object sender, EventArgs e)
11         {
12             Program.formList.Add(this);
13         }
14
15         public void FrmChild_FormClosed(object sender, FormClosedEventArgs e)
16         {
17             Program.formList.Remove(this);
18         }
19     }
20 }

所有有可能被弹出的窗体都继承FrmChild窗体

1     public partial class Form1 : FrmChild
2     {
3         public Form1()
4         {
5             InitializeComponent();
6         }
7     }

另外,我们在编写窗体弹出事件的时候,不要再使用一下代码,

 1         /// <summary>
 2         /// 打开Form1窗体
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void btnShow1_Click(object sender, EventArgs e)
 7         {
 8             Form1 frm1 = new Form1();
 9             frm1.Show();
10         }

可以直接调用“找窗体或是创建窗体”的方法,所有的窗体弹出都可以调用这样的方法:

 1         /// <summary>
 2         /// 打开Form1窗体
 3         /// </summary>
 4         /// <param name="sender"></param>
 5         /// <param name="e"></param>
 6         private void btnShow1_Click(object sender, EventArgs e)
 7         {
 8             Program.FindOrCreateFrom(typeof(Form1));
 9         }
10
11         private void btnShow2_Click(object sender, EventArgs e)
12         {
13             Program.FindOrCreateFrom(typeof(Form2));
14         }
15
16         private void btnShow3_Click(object sender, EventArgs e)
17         {
18             Program.FindOrCreateFrom(typeof(Form3));
19         }

这样,如若窗体已经打开,可以直接显示在最前方,如若还没有弹出,点击则仅会弹出一个窗体!

关于MDI窗体的跳转,可以定义一下类似的方法:

        private void FindChildForm(Type type){Form frm = null;foreach (Form frmChild in this.MdiChildren){if (frmChild.GetType() == type){frm = frmChild;frm.Activate();break;}}if (frm==null){frm = (Form)Activator.CreateInstance(type);frm.MdiParent = this;frm.Show();}}

  

  

转载于:https://www.cnblogs.com/jeffqing/archive/2012/07/28/2613223.html

Winform程序窗体间的跳转相关推荐

  1. 窗体间的跳转传值 1127

    窗体间的跳转传值 1127 需求情况 从窗口一获取数据 把数据传给窗体二 操作过程 在新窗体的类中定义一个公开的属性 当新窗体被实例化以后 该属性就可以被访问与存取值了 定义公开的属性 新窗体对象的属 ...

  2. 窗体间的跳转传值 1124

    窗体间的跳转传值 1124 目标 窗体一接收数据 窗体二显示,但是可以得到窗体一收到的数据

  3. 放弃winform的窗体吧,改用html作界面,桌面应用程序UI的新的开发方式。

    做过很多winform项目,都为winform控件头疼不已.想实现一些漂亮的样子总是很难.我这里列举几个缺点: 1.winform控件大多是 绝对布局 ,你需要给出准确的坐标.那么在实现居中效果就会很 ...

  4. WinForm窗体间如何传值

    窗体间传递数据,无论是父窗体操作子窗体,还是子窗体操作符窗体,有以下几种方式: 公共静态变量: 使用共有属性: 使用委托与事件: 通过构造函数把主窗体传递到从窗体中: 一.通过静态变量 特点:传值是双 ...

  5. 在winform程序中启动wpf窗体

    有时候需要在winform程序中利用wpf的许多优良特性,如何在其中启动wpf窗体呢? 前提:MainWindow.xaml是从别的地方copy到这个项目的,值得注意的是,除了MainWindow.x ...

  6. 窗体间跳转及传值 01

    窗体间跳转及传值 01 目标 需求 步骤 验证用户的算法 编码 非空验证方法 非空验证的多种方式 提交事件 主逻辑 验证通过,就执行主要的 连接打开,防止异常 本篇目标 实现登陆功能

  7. vue 传参 微信_小猿圈web前端之微信小程序页面间跳转传参方式总结

    原标题:小猿圈web前端之微信小程序页面间跳转传参方式总结 最近小程序发展的越来越快,很多大公司也在打造自己的小程序平台以及购物小程序等等,今天小猿圈web前端讲师就总结了关于微信小程序的知识点,首先 ...

  8. 支付宝小程序间的跳转问题

    最近在负责支付宝小程序的开发,遇到一个问题,在平台店领取优惠券后,需要跳转到相应的商家小程序去使用,这就涉及到小程序间的跳转问题,相关的API为navigateToMiniProgram. 1.不带参 ...

  9. 【转】WinForm窗体间数据交互的方法

    在窗体间传递数据的方法比较多: 1.在子窗体中自定义一个构造函数,参数类型是主窗体,当要显示子窗体的时候,就用这个构造函数来实例化子窗体,然后把this指针传进去,说起来太抽象了,我大概一写大家应该就 ...

最新文章

  1. 复旦计算机学院徐老师,复旦大学信息科学与技术学院徐跃东副研究员到课题组访问交流...
  2. 设置VMWARE通过桥接方式使用主机无线网卡上网
  3. cstart做int型转换运算Java,Java实验练习题目-供练习参考
  4. Python网络数据采集系列-------概述
  5. 【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2
  6. 【README1】动态规划之解题思路
  7. 微课|中学生可以这样学Python(7.3.3节):成员方法、类方法、静态方法
  8. Activiti中的事件监听
  9. 金字塔测试早已过时!
  10. 16进制颜色转换为UIColor
  11. 第2章 MCS-51 单片机硬件结构
  12. 干部人事数字档案管理系统,实现从“纸件”到“指尖”的安全蜕变
  13. 从赤壁之战看刘备与曹操暴露的最大差距
  14. php图片转换软件,能能图片格式转换器 支持主流图片格式批量转换,简单实用的图片转换软件...
  15. miui怎么用第三方图标包_快来领取你的图标包~
  16. Nginx 414 Request-URI Too Large报错解决方法
  17. RBA验厂咨询,RBA认证6.0有哪三个章节名称调整及行为准则改变要点说明
  18. Axure7视频教程百度云资源
  19. 长安UNIT鸿蒙系统,花13万提辆长安UNIT值吗?行驶1600公里后,车主终于说了句大实话...
  20. 基于Spring+SpringMvc+Mybatis开发javaWeb汽车维修管理系统

热门文章

  1. 三层交换不同VLAN间通信
  2. [转]推荐国外SQL Server学习网站
  3. android 开发使用adb操作sqlite
  4. Python 学习笔记13 类 - 继承
  5. [OpenGL]未来视觉1-Android摄像头采集基础
  6. 13篇文章,教你学会ES6知识点
  7. 搭建git for windows服务器(100%可以成功)【转】
  8. mysql,mairadb启动脚本
  9. emmet中文文档 (转载)
  10. 数据库连接池和Tomcat连接池的配置问题