Winform开发中的窗体重复及灵活切换问题

Winform开发中的窗体重复及灵活显示问题

1.问题引入

在项目中需要实现主窗体点击按钮后打开子窗体,但是如果不限制的话每次点击都会打开一个新窗体,用户体验不好还浪费内存。所以这里要做的是限制每个子窗体只可以打开一次,如果打开后没有关闭子窗体或者子窗体被最小化了,就直接把已打开的窗体激活并置顶显示。同时还要满足不同的子窗体是可以共存的,也就是只能同时有一个子窗体A,子窗体B,子窗体C……但是子窗体ABC之间是可以同时存在并互相切换的。

2.解决思路

这里我的做法是写两个方法:ShowOpenForm()用来激活已打开的窗体,同时返回Boolean值对应当前窗体的打开状态,NewForm()用于第一次打开新窗体的时候实例化窗体对象,并设置相关参数。

3.参考代码

整体结构

ShowOpenForm()方法:

 1  private Boolean ShowOpenForm(string frmName)
 2         {
 3             //Application .OpenForms为已打开的窗体
 4             foreach (Form frm in Application.OpenForms)
 5             {
 6                 if (frm.Name  == frmName)//如果传递的窗体名称参数已经存在
 7                 {
 8                     frm.Activate();//激活已有窗体
 9                     if (frm.WindowState == FormWindowState.Minimized)//如果已有窗体被最小化了
10                     {
11                         frm.WindowState = FormWindowState.Normal;//恢复被最小化窗体的显示
12                     }
13                     return false;//返回false说明窗体已打开
14                 }
15             }
16             return true;//已打开的窗体里没有作为参数传递的窗体,则返回true
17         }

NewForm()方法:

1  private void NewForm(Form objForm)
2         {
3             objForm.Show();//显示要打开的窗体的
4             objForm.Top = objForm.Top + 64;//项目需要,显示界面下移64像素
5         }

示例Click事件:

1  private void tsbVoucherQuery_Click(object sender, EventArgs e)
2         {
3             if (ShowOpenForm("FrmVoucherQuery"))//如果返回的Boolean值为true,则窗体没打开,调用NewForm()方法
4             {
5                 NewForm(new FrmVoucherQuery()); //调用打开新窗体方法,并直接实例化要打开的窗体作为参数窗体
6             }
7         }
时间: 2024-08-05 09:17:32

Winform开发中的窗体重复及灵活切换问题的相关文章

在Winform开发中使用日程控件XtraScheduler(2)--深入理解数据的存储

在上篇随笔<在Winform开发中使用日程控件XtraScheduler>中介绍了DevExpress的XtraScheduler日程控件的各种使用知识点,对于我们来说,日程控件不陌生,如OutLook里面就有日历的模块,但是这个日程控件真的是很复杂的一个控件,需要全面掌握可能需要花费很多的时间去了解,由于是技术研究,我总是希望把它常用的功能剖析的更加彻底一些,前面随笔也介绍了它的存储功能,把它基于实体类的方式存储在数据库里面,不过介绍的还不够,本文继续上面的内容,进行数据存储方面的介绍. 在

WinForm开发中屏蔽WebBrowser脚本错误提示的方法

通常在C#的实际开发过程中,会发现设置其属性ScriptErrorsSuppressed无法达到屏蔽脚本错误效果,但是可以通过下面两种方式实现这一效果. 1.在DocumentCompleted事件中订阅Error处理 ,代码如下所示: private void wbGoogleMap_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { wbGoogleMap.Document.Window.Err

WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

本文转载:http://www.cnblogs.com/umplatform/archive/2012/08/29/2660240.html 在B/S开发中,对TreeView控件要改变当前选中节点的颜色比较方便,其有相应的SelectedNodeChanged事件进行控制,但对于WinForm则没有这样方便.申明一下,我在这儿所说的改变当前节点的字体与颜色,主要是在WinForm中的TreeView控件,当前选中节点后,其失去鼠标焦点后节点的字体与颜色失去了选中状态,层级一多,我们就不知道当前

Android开发中WIFI和GPRS网络的切换

在项目的开发中因为要使用到WIFI和GPRS网络的切换,因此就研究了一下通过代码打开WIFI和GPRS的工作. 无论是切换WIFI还是切换GPRS网络都需要设置相应的权限,所以需要在AndroidManifest.xml文件中加入以下几行代码. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="andro

c# winform中预防窗体重复打开

  当窗体以非模态形式打开的时候,有可能出现重复打开的情形,利用以下的代码可以预防重复打开! 1 foreach (Form f in Application.OpenForms) 2 { 3 if (f.Name == "Form1") 4 { 5 if (f.WindowState == FormWindowState.Minimized) 6 { 7 f.WindowState = FormWindowState.Normal; 8 } 9 f.Activate(); 10 f.

Winform开发中常见界面的DevExpress处理操作

我们在开发Winform程序的时候,需要经常性的对界面的一些控件进行初始化,或者经常简单的封装,以方便我们在界面设计过程中反复使用.本文主要介绍在我的一些项目中经常性的界面处理操作和代码,以便为大家开发的时候提供必要的参考. 1.选择用户的控件封装操作 在一些系统模块里面,我们需要选择系统人员作为经办人员的操作,如下面几个界面场景所示. 我们注意到,一般在我们选择的时候,界面会弹出一个新的层给我们选择,里面通过列表详细展示相关的信息,还可以支持搜索,非常方便. 当我们完成选择的时候,我们看到界面

在Winform开发中使用日程控件XtraScheduler

在一些应用场景中,我们可能需要记录某一天,某个时段的日程安排,那么这个时候就需要引入了DevExpress的日程控件XtraScheduler了,这个控件功能非常强大,提供了很好的界面展现方式,以及很多的事件.属性给我们定制修改,能很好满足我们的日程计划安排的需求,本文全面分析并使用这个控件,希望把其中的经验与大家分享. 1.日程控件的表现效果 整个日程控件,可以分为日视图.周视图.月视图等等,当然还有一些不常用的时间线.甘特图等,本例我们来关注控件的使用以及这几个视图的处理.先来看看他们的界面

winform开发中的隐藏与展开实现原理

窗体程序中,经常会用到点击某个按钮,将某一部分显示出来或者隐藏起来.现已公司项目outlook中的任务详情页面为例. groupbox控件中放一些label用于展示一些数据,然后,groupbox控件的高度减少就可以隐藏这部分数据,高度足够,那么 groupbox控件里面的控件就显露出来了.上图:

平台开发中访问窗体其他属性

dim form1 = 创建窗体("7b139d1d1a4343ff9097d3f5aae04a50")    '设置窗体为最前    form1.FormContainer.TopMost=true '设置窗体状态,0还原,1最小话,2最大化 form1.FormContainer.WindowState=0如果是本窗体的话直接用me,如: me.FormContainer.TopMost=true me.FormContainer.WindowState=0 原文地址:http:/