问题描述
C#窗体如何实现在调用子窗体后关闭自身窗体,而被调子窗体不关闭?类似登录窗体,除了在登录窗体后出现的主界面窗体的载入方法中运行登录窗体实例,就没有其它办法能实现了吗?
解决方案
解决方案二:
show子窗体同时close父窗体不行么
解决方案三:
这种情况貌似不行。因为主窗体是程序入口。你关了主窗体,子窗体就关了。只能隐藏。
解决方案四:
将子窗体变量定义在父窗体的外边,使用时父窗体实例化,不用时在某个地方关闭或者隐藏
解决方案五:
引用楼主sandwave的帖子:
C#窗体如何实现在调用子窗体后关闭自身窗体,而被调子窗体不关闭?类似登录窗体,除了在登录窗体后出现的主界面窗体的载入方法中运行登录窗体实例,就没有其它办法能实现了吗?
可以如下做。staticvoidMain(){FrmLoginfrmLogin=newFrmLogin();frmLogin.ShowDialog();if(frmLogin.DialogResult==DialogResult.OK){Application.Run(FrmMain());}else{Application.Exit();}}在frmLogin的登录按钮里写如下代码privatevoidcmdLogin_Click(objectsender,EventArgse){//登录的参数判断if(登录成功){this.DialogResult=DialogResult.OKthis.Close();}else{return;}}
解决方案六:
this.Hide();//隐藏登录画面fromObj.ShowDialog();//显示子form//显示登录画面this.Show();
解决方案七:
登陆画面这么些就可以。登陆显示登录后的主画面,主画面关闭后再重新显示登陆画面。
解决方案八:
用Application.Run(new新登陆窗口());,,新开个线程用来显示新窗口,然后你就可以this.Dispose();掉自身了
解决方案九:
和楼主有同样的困扰!感觉楼上的几位说的方法好像不好用。我想实现从主界面->分界面(主界面不显示)->主界面好想很简单,但就是实现不了,等大侠来帮助!!!支持楼主!!!
解决方案十:
应该不可以吧..不过隐藏主界面不就能达到一样的效果吗?
解决方案十一:
引用8楼love_aiqiu_123的回复:
和楼主有同样的困扰!感觉楼上的几位说的方法好像不好用。我想实现从主界面->分界面(主界面不显示)->主界面好想很简单,但就是实现不了,等大侠来帮助!!!支持楼主!!!
怎么就不行呢?//验证密码通过后frmMain_frmMain=newfrmMain();_frmMain.Show();//弹出manageForm后,隐藏form1this.Hide();
解决方案十二:
抱歉我太想当然了,不能通过Application.Run(newForm2());this.Dispose();的方法来达到LZ说的效果。会提示无法从单一线程中开启消息循环……LZ可以新建一个线程用来显示Form2,Form1的消息循环线程就可以结束了privatevoidButton1_MouseClick(objectsender,MouseEventArgse){Threadt=newThread(newThreadStart(delegate{Application.Run(newForm2());}));t.Start();this.Dispose(true);}
解决方案十三:
Form2form=newForm2();form.showDialog();
解决方案十四:
引用楼主sandwave的帖子:
C#窗体如何实现在调用子窗体后关闭自身窗体,而被调子窗体不关闭?类似登录窗体,除了在登录窗体后出现的主界面窗体的载入方法中运行登录窗体实例,就没有其它办法能实现了吗?
如果两个窗体是父子窗体的关系,那么父窗体关闭,子窗体也会关闭的。就想楼房,若果一楼倒塌了,那二楼肯定也就没了。你说的可以不要把两个窗体设为父子窗体的关系,彼此间独立。就很容易实现了。
解决方案十五:
隐藏
解决方案:
也可以在Main窗体Load中,调用Login。
解决方案:
引用14楼amao521的回复:
隐藏
up
解决方案:
依照楼主的意思,这样貌似不行吧?把父窗口关闭之后,子窗体也就关闭了。你可以,hide或者是this.Visible=false;
解决方案:
up
解决方案:
子窗体关闭父窗体必然是不行的。一个窗体的析构过程在是这样的,先检查是不是new出了子窗体,如果是,则先调用子窗体的析构,即关闭子窗体,然后在调用自己的析构函数,将自己关闭。这样理解来看,如果子窗体想要关闭父窗体,那么就得先关闭自己才行,本身来看就矛盾了。我有一个例子:使用了三个窗体,A:第一个启动的窗体,显示程序版本信息。在Form_load事件中显示Login画面(B窗体)B:Login窗体C:程序主窗体。Login成功后进入。主窗体显示的时候,A和B都要隐藏。怎么做呢?有两种办法,第一个使用委托。这个稍微难一点,但是也可以实现,我已经试验成功(当然不是试图去关闭父窗体,只是让它隐藏不显示)方法2:在B窗体中保存A窗体的实例,(即:在BShow之前的构造B时,将A本身传给B),同样C中包含B的实例在B窗体的登陆按钮压下,并且成功登陆后使用下面的代码:this.WindowState=FormWindowState.Minimized;this.sbi.WindowState=FormWindowState.Minimized;//sbi是A窗体的实例当然这样还没有隐藏掉,你还需要在A和B窗体的Resize事件中写代码if(this.WindowState==FormWindowState.Minimized){this.Visible=false;//this.SendToBack();}}到此实现了隐藏的功能,下面讲解怎么实现关闭的功能。在C的Closing事件中,关闭B(C中包含B的实例),在B的Closing事件中关闭A(B中包含A的实例)
解决方案:
隐藏--!
解决方案:
回帖是一种高尚的情操
解决方案:
先把那个主窗体隐藏了,代码是this.hide();显示那个窗体,在把那个窗体实例话了,代码是例如:form1cn=form();在把你想显示的那个窗体显示就行了,代码是cn.show();就这样ok了
解决方案:
学习19楼
解决方案:
无法关闭父级窗体,要么hide要么通过main函数来启动,要么你就在进了主窗体然后弹出登录窗体。
解决方案:
在主程序窗体的模块(FM)外部模块(FW)中要调用FM中的东西,设定一个全局的量,通常为静态,把FM的引用传递给静态量,引用它就可.
解决方案:
Main方法不要写在主窗口中,其实可以把两个窗口程序看成独立的对象就可以了,如progame.cs中写main方法Main(){LoginFromlf=newLoginFrom();//这里对lf进行判断if(OK){Mainformmf=newMainform();mf.show;}}vs2005自动创建的工程,都已经把Main方法拿到一个独立的cs文件里面了,Program.cs
解决方案:
我刚刚解决的问题哈你参考一下!比较简单实用吧主窗体为程序入口,登录窗体中,登陆成功后先不要把它dispose(),暂时隐藏.由主窗体来解决它! //通过登录窗体进行登录Loginlogin=newLogin();login.ShowDialog();if(login.IsDisposed){this.Dispose();} //登录后注销掉登录窗体//label1.Text=login.Controls["textBox1"].Text.ToString();login.Dispose();
解决方案:
隐藏,或者不要建立父子关系。
解决方案:
引用11楼tsorgy的回复:
LZ可以新建一个线程用来显示Form2,Form1的消息循环线程就可以结束了C#codeprivatevoidButton1_MouseClick(objectsender,MouseEventArgse){Threadt=newThread(newThreadStart(delegate{Application.Run(newForm2());}));t.Start();…
哇,能想到用线程,太牛了,我也得试试~~
解决方案:
5楼的做法不错不过昨天看MSDN的帖子说窗体显示为对话框时,点击关闭按钮,不会调用对话框窗体的Close()方法并且要在处理完对话框的DialogResult后,调用对话框的Dispose()方法来释放对话框窗体占用的资源Formlogin=newForm();login.ShowDialog();if(login.DialogResult==DialogResult.OK){login.Dispose();Application.Run(newmainForm());}else{login.Dispose();}我在窗体的事件处理程序里是直接这样些的privatevoidokButton_Click(objectsender,EventArgse){//省略若干验证代码this.DialogResult=DialogResult.OK;}privatevoidcancelButton_Click(objectsender,EventArgse){this.DialogResult=DialogResult.Cancel;}在事件处理程序中没有调用Close()方法尽管调用了好像也没什么区别但是参照文档还是这样写了
解决方案:
还得在login窗体的closing事件中加一行代码this.dispose();因为点LOGIN右上角的x时也要能退出,而不加载主窗体!!
解决方案:
引用27楼seewp的回复:
我刚刚解决的问题哈你参考一下!比较简单实用吧主窗体为程序入口,登录窗体中,登陆成功后先不要把它dispose(),暂时隐藏.由主窗体来解决它! C#code //通过登录窗体进行登录Loginlogin=newLogin();login.ShowDialog();if(login.IsDisposed){this.Dispose();} …
还得在login窗体的closing事件中加一行代码this.dispose();因为点LOGIN右上角的x时也要能退出,而不加载主窗体!!
解决方案:
引用4楼abcyzq的回复:
引用楼主sandwave的帖子:C#窗体如何实现在调用子窗体后关闭自身窗体,而被调子窗体不关闭?类似登录窗体,除了在登录窗体后出现的主界面窗体的载入方法中运行登录窗体实例,就没有其它办法能实现了吗?可以如下做。staticvoidMain(){FrmLoginfrmLogin=newFrmLogin();frmLogin.ShowDialog();if(frmLogin.DialogResult==DialogResult.OK)…
4楼的方法可以
解决方案:
Application的run有几种重载.其中一种是Application.Run(Form)这代表一旦Form被关闭就自动退出消息循环.VSIDE默认生成的代码就是调用的这个重载.而LZ需要的是关闭程序启动时显示的Form1(Application.Run里的那个)显示Form2且不中断消息循环.可以这样修改Main函数:Form1frm=newForm1();frm.Show();Application.Run();
这样你在关闭Form1后就不会退出消息循环了.但是缺点就是你的Form2关闭后消息循环也不会退出.程序的退出需要你自己调用Application.Exit();
解决方案:
///<summary>///用户登录///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidloginBtn_Click(objectsender,EventArgse){if(UseNameTxt.Text.Trim().Length==0){UseNameTxt.Focus();lblUse.Visible=true;}//stringrole=myUserCheck(UseNameTxt.Text,PwdTxt.Text);stringrole="test";if(role.Length!=0){Threadth=newThread(newThreadStart(delegate{Application.Run(newFrmMain(role));}));th.Start();this.Dispose();this.Close();}}///<summary>///关闭登录画面///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidCloseBtn_Click(objectsender,EventArgse){this.Dispose();this.Close();}
解决方案:
上面的方法和下面的方法全部都可以实现登录画面的效果!并且已经实际运行过了。==========================================================================staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);FrmLoginfrmLogin=newFrmLogin();frmLogin.ShowDialog();if(frmLogin.DialogResult==DialogResult.OK){Application.Run(newFrmMain(frmLogin.Role));}else{frmLogin.Dispose();frmLogin.Close();}}=====================================================================///<summary>///用户登录///</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidloginBtn_Click(objectsender,EventArgse){if(UseNameTxt.Text.Trim().Length==0){UseNameTxt.Focus();lblUse.Visible=true;}//role=myUserCheck(UseNameTxt.Text,PwdTxt.Text);role="test";if(role.Length!=0){this.DialogResult=DialogResult.OK;this.Close();}return;}///<summary>//////</summary>///<paramname="sender"></param>///<paramname="e"></param>privatevoidCloseBtn_Click(objectsender,EventArgse){this.DialogResult=DialogResult.Cancel;}
解决方案:
只能隐藏...
解决方案:
公司招聘高级C#工程师3年以上C#.NET技术路线经验(开发、分析、设计)、1年以上的软件系统设计经验,熟悉UML建模,珠海政采软件技术有限公司北京分公司地址:北京市海淀区中关村软件园网址:http://www.gpcsoft.com邮箱:wangyq@gpcsoft.com;evalywang99@yahoo.com.cn
解决方案:
A窗体调用B窗体,A窗体就变成了B窗体的父窗体,B依赖于A窗体而存在,A死了,B没有了依赖体就会死亡。可以在生成B的时候隐藏A,有时候在项目中,窗体时相对的,A是父窗体,有时候可以看做子窗体,让B这个子窗体看做父窗体来调用A
解决方案:
经本人验证,11楼的写法可以,而且本人认为较好!
解决方案:
顶下11楼的,方法不错,我是用你的方法实现的
解决方案:
顶11楼,不错,这是一个很好的思路
解决方案:
顶个貌似11楼方法不错
解决方案:
form1f1=newform1();f1.show();this.Hide();
解决方案:
顶11楼,貌似挺好
解决方案:
11楼不错
解决方案:
http://zhidao.baidu.com/question/135595846.html
解决方案:
十一楼的那个方法不能从子窗体重新生成主窗体。我是想弄一个字窗体添加数据,然后重新调回主窗体刷新页面。可是主窗体关了之后貌似无法再开启。
解决方案:
引用4楼abcyzq的回复:
引用楼主sandwave的帖子:C#窗体如何实现在调用子窗体后关闭自身窗体,而被调子窗体不关闭?类似登录窗体,除了在登录窗体后出现的主界面窗体的载入方法中运行登录窗体实例,就没有其它办法能实现了吗?可以如下做。staticvoidMain(){FrmLoginfrmLogin=newFrmLogin();frmLogin.ShowD……
这个挺好的,难道你还有其它的需求?
解决方案:
学习了