C#winForm如何不让同一个窗体显示多次

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#winForm如何不让同一个窗体显示多次相关的知识,希望对你有一定的参考价值。

例如我打开登录界面后点击注册,会弹出注册界面 我在点击注册就会又出现一个注册窗体,如何在第二次点击的时候让第一次点击弹出的注册界面关闭,本人新手,求详细过程或大概代码

提供几种方法供参考:

方法1:
private void button1_Click(object sender, EventArgs e)

frmReg form = new frmReg();
form.ShowDialog(); //直接用ShowDialog方法显示


方法2:
private void button2_Click(object sender, EventArgs e)

if (this.OwnedForms.Length > 0)

//如果存在已经打开的注册窗口,则先关闭打开的注册窗口
//小缺点:要确保OwnedForms[0]指的就是frmReg窗口
this.OwnedForms[0].Close();

frmReg form = new frmReg();
form.Show(this); //将本窗口作为注册窗口的拥有者传入,也可用下面2句代替
//form.Owner = this;
//form.Show();


方法3:
frmReg form = null; //声明一个全局变量
private void button3_Click(object sender, EventArgs e)

if (form == null)
form = new frmReg(); //如果没有已打开的注册窗口,则新开一个
form.TopMost = true; //让注册窗口显示在顶层
form.Show();


方法4:
为注册窗口实现单例模式,原理跟方法3类似,就是将判断null放入注册窗口里面,并且不让从外部直接new新窗口,当然还有些细节要注意的
参考技术A 这个就是所谓的 单例模式 你可以上网搜索一下
在你的登录界面中 建立一个private static 的类类型变量
我这里用的是Danli 作为类的名的
记住一个私有的构成方法 还一个私有的静态的类类型变量
再加上一个公共的返回值是类类型的方法就可以啦
在这个方法里面判断类类型是否为空 如果空就创建一个
如果不是空 就直接返回
public partial class Danli : Form


private static Danli mod = null;

private Danli()

InitializeComponent();


public static Danli GetInstance()

if (mod == null)

mod = new Danli();

return mod;



在你要调用的页面 就不能使用new的方法创建对象了 因为是static的
Danli danli = Danli.GetInstance();
danli.Show();
这样 你试试看
参考技术B 建议你
点击注册弹出窗体时加入代码this.Visible = false;隐藏登陆界面
注册窗口关闭时再把登陆界面显示出来 XXXX.Visible = true;
(XXXX为登陆界面窗口的代号)
参考技术C 用ShowDialog()弹出窗口,别用show()。

C#winform中父窗体打开后下面有一排导航,导航打开子窗体,子窗体停靠在父窗体中间

问题出在如果我点击父窗体,那么子窗体就跑到后面去了,打不到效果。如何让子窗体一直靠前,父窗体上的按钮又能使用?

1、在 子窗体.Show() 之前写一句 子窗体.MdiParent = this; 这样show出来的子窗才会真正是父窗体与子窗体,子窗体将在父窗体的范围内,而且可以多次打开,不过我个人不太建议这种做法;
2、把要show出来的窗体的TopMost属性设为true; (个人推荐)追问

你的第二种方法非常管用,但是我发现点击第一个窗口出现子窗体,点击父窗口的第二个按钮又出现了第二个子窗口,都重叠在一起了。能不能同时只打开一个子窗体呢》?

追答

假设要show的窗体名为Frm_Name
Frm_Name newFrm = null;
if(newFrm == null)

newFrm = new Frm_Name;

newFrm.Show();

你试试这样可以不,我都是写在Factory里的,还没这样写过,你可以试一下。

追问

不行,我的子窗体很多,你这样只能判断一个子窗体。我已经实现了判断一个子窗体。
if (toolStripStatusLabel1.BackColor != Color.White)

l1 = new Light();
l1.Show();
toolStripStatusLabel1.BackColor = Color.White;

else

if (toolStripStatusLabel1.BackColor == Color.White)

l1.Hide();
toolStripStatusLabel1.BackColor = TransparencyKey;

追答

这个..那我就不知道了。
你是想打开一个新的子窗体时,把之前已经打开的子窗体关闭吗?这样不太符合常规操作习惯啊....

追问

就是要关闭其他子窗体,你理解我的意思了。哪里就不符合常规了啊?比如说我第一次打开form2,当我点击第二个按钮后打开form3,的同时,form2会自动关闭

追答

首先,form2和form3的功能不一样对吧,有可能相关也有可能不相关,如果是功能相关怎么办?你确定用户想打开一个就自动关掉另一个?而且这样会导致任何两个子窗体永远无法并存。
假设你正在用一款软件,先设置其中一项功能,改了选项,还没点确定,你就去设置别的功能了,难道软件会自动把之前那个模块给你关掉吗?要么是提示框进行操作确认,要么是直接禁止这种乱搞的操作。
通常的做法是ShowDialog(),这样程序开发人员也省事,也不违背用户操作习惯。

追问

showdialog打开后父窗体无法使用了。我的意思是,用一个父窗体当容器,父窗体的按钮(导航)操作子窗体,所有子窗体的大小都是一样的,都在里面显示,点击一个子窗体另外的子窗体就要关掉

追答

父窗体当容器那还是用最开始说的第一个方法好。
但是我确实从来没弄过打开一个子窗体要关闭其他子窗体的。大概想了一下,不好做判断。

参考技术A 用MDI窗体 打开子窗体是用 窗体.ShowDialog();
或者直接用ShowDialog();
参考技术B 用MDI窗体程序 参考技术C MDI

以上是关于C#winForm如何不让同一个窗体显示多次的主要内容,如果未能解决你的问题,请参考以下文章

C#WinForm中如何修改窗体显示的位置?

如何设置禁止改变“C# WINFORM”窗体大小?

C#winform中父窗体打开后下面有一排导航,导航打开子窗体,子窗体停靠在父窗体中间

C#Winform如何实现日志信息实时显示到窗体

C#winform 窗体样式的切换

C#WinForm如何在点击按钮获取数据后,将数据在按钮所在窗体上显示出来