如何禁止同一窗体重复出现 点击button1,弹出窗体 frmTemp再次点击,还会再次出现一个新的frmTemp点击N次,出现N次 frmTemp,怎么防止同一个窗体仅出现一次呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 表达清楚问题啊同学!什么叫“防止”同一个窗体仅出现一次?姑且体会一下你的意思吧,方法很多:从设计模式的角度,你可以参考单例模式;嫌麻烦,可以用一个Dictionary,Form打开的时候Add,关闭的时候Remove;还有一个Application.OpenForms,你可以去遍历查找。 关闭事件,修改成hide然后打开事件,进行判断,如果有该实例,则active,否则new 1.定义一个bool,判断下状态是否弹出 2.frmTemp在函数外面定义,控制frmTemp的hide和show 两种方式,一种是用窗体的showdialog,而不用show。另一种方式,是预先放一个全局变量,当变量为空时,则创建(new)并打开窗体。如果不为空时,则显示(show)并激活窗体(active)。这种方式,窗体不能close,只能hide。这么说明白了吧? 定义bool,如何用代码判断 是否弹出呢?这个我不知道,我只能选择 Show(); 不能选择 ShowDialoge(); frmTemp Temp = new frmTemp(); if (????) { Temp.Activate(); } else { Temp.Show(); }是这样判断frmTemp是否已弹出呢? 单例模式 其实就是 检查现在有没有frmtemp的实例,有就返回这个实例,没有才去new一个出来! 如何用代码检查现在有没有frmtemp的呢?谢谢 楼主应该是用modeless的模式打开窗口,这样的话,只需要保证在父窗口中只声明了一个子窗口的实例对象就可以了。比如:Class ParentForm: Form{ private ChildForm _childForm = new ChildForm(); private void button1_Click(object sender, EventArgs args) { _childForm.Show(); }}这样每次Click都只是把唯一的这个子窗口Show一下而已,即使它已经Show了也没关系。 不行呢,连frmTemp窗体也不能弹出来了 public Form2 frm;//设置全局变量,假设要打开的窗体为Form2/////////////////////以下是具体的打开窗体代码////////////////////// if (frm == null || frm.IsDisposed) { frm = new Form2(); frm.Visible = true; } else { frm.Visible = true; } 不太明白,能否给出具体的代码呢?谢谢假设窗口名称为Testprivate static Test singleton; public static Test Singleton { get { if (singleton == null) { singleton = new Test(); } return singleton; } }但是,这样用需要修改一下关闭事件private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { e.Cancel = true;//取消关闭事件 this.Visibility = Visibility.Hidden; singleton = null; }当需要调用这个Test窗口时,直接使用Test.Singleton.Show(),就不需要new新窗口了。用15楼的方法也可行 Form2 f2 = null; private void button1_Click(object sender, EventArgs e) { if (f2 != null) { return; } else { f2 = new Form2(); f2.Show(); } } 单例模式,具体方法:(以下所有方法值针对想要出现一次的那个窗体)1、将构造函数私有化(把public改成private)2、创建本类唯一的一个实例(声明)3、使用静态方法,返回唯一的实例4、窗体关闭时,将创建的唯一实例清空。(通过formClosing事件来完成) using System;using System.Collections.Generic;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Diagnostics;namespace frmMain{ static class Program { private const int WS_SHOWNORMAL = 1; [DllImport("User32.dll")] private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); [DllImport("User32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Process instance = GetRunningInstance(); if (instance == null) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new frmMain()); } else { HandleRunningInstance(instance); } } /// <summary> /// 获取当前是否具有相同进程。 /// </summary> /// <returns></returns> public static Process GetRunningInstance() { Process current = Process.GetCurrentProcess(); Process[] processes = Process.GetProcessesByName(current.ProcessName); //遍历正在有相同名字运行的例程 foreach (Process process in processes) { //忽略现有的例程 if (process.Id != current.Id) //确保例程从EXE文件运行 if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName) return process; } return null; } /// <summary> /// 激活原有的进程。 /// </summary> /// <param name="instance"></param> public static void HandleRunningInstance(Process instance) { ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL); SetForegroundWindow(instance.MainWindowHandle); } }} /// <summary> /// 私有的 静态 进行传递到 Main 里 /// </summary> private static OnlyOneForm onlyOneForm = null; private static readonly object padlock = new object(); //私有的 private OnlyOneForm() { InitializeComponent(); } /// <summary> /// 单例方法——共有的 /// </summary> /// <returns></returns> public static OnlyOneForm GetInstrance() { if (onlyOneForm == null) { lock (padlock)//双重锁防止多线程安全问题 { if (onlyOneForm == null) { onlyOneForm = new OnlyOneForm(); } } } return onlyOneForm; } 一句话,用模态窗口,ShowDialog(); 就用ShowDialog()。这个是微软内置优化的解决方法。性能也好。 6楼的方式可以采取,两种方法都可以,全局变量你点Button的时候判断下,弹出后变量给个值,再点,判断是不是这个值再决定弹窗与否就可以。 通过窗口标题来判断如果是MDI界面,打开前先遍历整个this.MdiParent.MdiChildren,如果有相同标题的则返回true,this.MdiParent.MdiChildren[i].Activate();无相同的则新建如果不是MDI,则你在打开时设定第二窗体为第一个窗体的子窗体newForm.Owner=this;打开第二窗体前先判断第一窗体子窗体里是否已有第二窗体,同样可以通过标题来判断通过窗体标题来判断的好处是有时候有的窗体会 根据情况 多次按不同功能应用,这样,只要标题不一样就可以再次打开,而标题一样的都是应用相同的,只需要打开一个 大家帮我看看这段代码 正在开发一个基于.NET的业务开发平台,大家有没有什么好的建议? 怎样把两个字符串数组拼接成一个 请教:如何实施对文件夹的监控?????? 请高手解答,在我认为是一个比较怪的问题 vs2003用哪个版本的vss? 问题很急,解决了就给分,在线=== 急,请教一个C#网络编程的问题 请问怎么在程序出错后,屏蔽系统错误信息,而提供自己得出错信息 求助。for循环与if判断 【WPF新手求助】 如何在一个框中嵌套其他框 winform水晶报表格式化字符串并求和
姑且体会一下你的意思吧,方法很多:
从设计模式的角度,你可以参考单例模式;
嫌麻烦,可以用一个Dictionary,Form打开的时候Add,关闭的时候Remove;
还有一个Application.OpenForms,你可以去遍历查找。
2.frmTemp在函数外面定义,控制frmTemp的hide和show
另一种方式,是预先放一个全局变量,当变量为空时,则创建(new)并打开窗体。如果不为空时,则显示(show)并激活窗体(active)。这种方式,窗体不能close,只能hide。
这么说明白了吧?
定义bool,如何用代码判断 是否弹出呢?
这个我不知道,我只能选择 Show(); 不能选择 ShowDialoge();
if (????)
{
Temp.Activate();
}
else
{
Temp.Show();
}是这样判断frmTemp是否已弹出呢?
如何用代码检查现在有没有frmtemp的呢?谢谢
Class ParentForm: Form
{
private ChildForm _childForm = new ChildForm();
private void button1_Click(object sender, EventArgs args)
{
_childForm.Show();
}
}
这样每次Click都只是把唯一的这个子窗口Show一下而已,即使它已经Show了也没关系。
不行呢,连frmTemp窗体也不能弹出来了
public Form2 frm;//设置全局变量,假设要打开的窗体为Form2
/////////////////////以下是具体的打开窗体代码//////////////////////
if (frm == null || frm.IsDisposed)
{
frm = new Form2();
frm.Visible = true; }
else
{
frm.Visible = true;
}
不太明白,能否给出具体的代码呢?谢谢假设窗口名称为Test
private static Test singleton;
public static Test Singleton
{
get
{
if (singleton == null)
{
singleton = new Test();
}
return singleton;
}
}但是,这样用需要修改一下关闭事件
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;//取消关闭事件 this.Visibility = Visibility.Hidden;
singleton = null; }
当需要调用这个Test窗口时,直接使用Test.Singleton.Show(),就不需要new新窗口了。用15楼的方法也可行
private void button1_Click(object sender, EventArgs e)
{
if (f2 != null)
{
return;
}
else
{
f2 = new Form2();
f2.Show();
}
}
1、将构造函数私有化(把public改成private)
2、创建本类唯一的一个实例(声明)
3、使用静态方法,返回唯一的实例
4、窗体关闭时,将创建的唯一实例清空。(通过formClosing事件来完成)
using System;
using System.Collections.Generic;
using System.Windows.Forms;using System.Runtime.InteropServices;
using System.Diagnostics;namespace frmMain
{
static class Program
{
private const int WS_SHOWNORMAL = 1;
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{ Process instance = GetRunningInstance();
if (instance == null)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmMain()); } else
{
HandleRunningInstance(instance);
}
} /// <summary>
/// 获取当前是否具有相同进程。
/// </summary>
/// <returns></returns>
public static Process GetRunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
//遍历正在有相同名字运行的例程
foreach (Process process in processes)
{
//忽略现有的例程
if (process.Id != current.Id)
//确保例程从EXE文件运行
if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
return process;
}
return null;
}
/// <summary>
/// 激活原有的进程。
/// </summary>
/// <param name="instance"></param>
public static void HandleRunningInstance(Process instance)
{
ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
SetForegroundWindow(instance.MainWindowHandle);
} }
}
/// <summary>
/// 私有的 静态 进行传递到 Main 里
/// </summary>
private static OnlyOneForm onlyOneForm = null;
private static readonly object padlock = new object();
//私有的
private OnlyOneForm()
{
InitializeComponent();
} /// <summary>
/// 单例方法——共有的
/// </summary>
/// <returns></returns>
public static OnlyOneForm GetInstrance()
{
if (onlyOneForm == null)
{
lock (padlock)//双重锁防止多线程安全问题
{
if (onlyOneForm == null)
{
onlyOneForm = new OnlyOneForm();
}
}
}
return onlyOneForm; }
如果是MDI界面,打开前先遍历整个this.MdiParent.MdiChildren,如果有相同标题的则返回true,this.MdiParent.MdiChildren[i].Activate();无相同的则新建
如果不是MDI,则你在打开时设定第二窗体为第一个窗体的子窗体newForm.Owner=this;
打开第二窗体前先判断第一窗体子窗体里是否已有第二窗体,同样可以通过标题来判断
通过窗体标题来判断的好处是有时候有的窗体会 根据情况 多次按不同功能应用,这样,只要标题不一样就可以再次打开,而标题一样的都是应用相同的,只需要打开一个