C#调用子窗体后关闭自身(父窗体)

问题描述

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……

这个挺好的,难道你还有其它的需求?
解决方案:
学习了

时间: 2024-11-02 11:30:15

C#调用子窗体后关闭自身(父窗体)的相关文章

父窗全能使用-弹出子窗体后,要求父窗体能继续使用,并且打开其它程序时能够复盖子窗体,不知道哪位大神有好办法!

问题描述 弹出子窗体后,要求父窗体能继续使用,并且打开其它程序时能够复盖子窗体,不知道哪位大神有好办法! 解决方案 思路: 1.将弹出窗体去掉 2.将扩展字段的页面写在当前页面panel中,点击隐藏显示panel

IE6/7 and IE8/9/10(IE7模式)依次隐藏具有absolute或relative的父元素和子元素后再显示父元素_javascript技巧

如下 1,两个div,d1中包含d2 2,d1,d2都设置了absolute或relative 3,隐藏d1 4,隐藏子元素d2 5,显示d1 这时IE6/7 and IE8/9/10(IE7模式)中会发现,子元素d2也能显示出了(别忘了,d2被display:none 了哦).但IE8/9/10/Firefox5/Safari4/Chrome12中子元素d2仍然是被隐藏的. 重现代码 复制代码 代码如下: <!DOCTYPE HTML> <HTML> <HEAD> &

winform怎么在关闭一个窗体后显示另一个窗体?

问题描述 关闭窗体我知道有:窗体.Close();和窗体.Dispose();这样按下关闭后整个程序都关了,我不是想要这样的效果,而是在这个关闭之后另外一个能生成? 解决方案 解决方案二:把原来的窗体隐藏,把新的窗体表现出来例如你现在打开的是Form1还有一个窗体是Form2frm1.hide();form2frm2=newfrom();frm2.show();解决方案三:不要close(),用户hide()解决方案四:如果你想弄类似登录窗体和主界面的窗体,可以先加载主窗体,然后在主窗体的loa

用window.open弹窗的窗体怎么在关闭这个弹出窗体的时候刷新父窗体

问题描述 现在项目是asp.net开发的,由于用到了报表,所有集成了帆软报表,使用window.open根据URL地址弹窗的报表页面.(帆软是java开发的,只能部署在tomcat服务器上,根据URL地址打开),现在就是想在弹窗的这个报表页面关闭的时候刷新父页面.window.parent.location.reload();试过,他刷新的还是报表页面自己,没有刷新父窗体.,图片上点击预览按钮弹窗的报表. 解决方案 解决方案二:试试window.opener.location.reload();

Winform窗口里的嵌入WPF的UserControl,关闭Winform父窗体的方法

可以在form_load事件里把this传给UserControl,然后在usercontrol里调用form的各种方法,不过这种做法不太好,耦合性较高.标准做法是用事件传递 UserControl里加如下代码:  public delegate void FormCloseEventHandler(object sender, EventArgs e); public event FormCloseEventHandler FormClose; private void button_quit

c# winform限制模式窗体不能超出mdi父窗体

问题描述 如何控制mdi子窗体弹出的模式子窗体不能被拖出mdi主窗体之外? 解决方案 解决方案二:把主窗体的Bounds参数传到模态窗体中,移动时判断下就行了

C#父窗体监听子窗体关闭事件

问题描述 父窗体打开一个子窗体同时改变父窗体大小已经会写了,结果关闭一个子窗体后如何后面还有子窗体就不会改变父窗体大小,用foreach语句让父窗体读取当前激活的子窗体又不行,怎么改 解决方案 解决方案二:打开的时候用变量存储,解决方案三:这问题问得完全看不懂解决方案四:我有使用bool型变量判断开没开,但是我是需要在子窗体关闭事件后触发父窗体重新用foreach语句找到当前被激活(就是已经被打开的最顶层子窗体)的其余子窗体的事件,然后根据是哪个子窗体被激活调整父窗体大小,结果foreach语句

C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)

本文转载:http://www.csframework.com/archive/2/arc-2-20110805-1771.htm 文章侧重点主要是讨论"窗体"与"窗体"之间方法的调用,以及"MDI父窗体"与"Chilid子窗体"之间如何相互的调用方法. C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用) 看似一个简单的功能需求,其实很多初学者处理不好的,很多朋友会这么写: C# Code: //父窗体是是frmPare

javascript 子窗体父窗体相互传值方法_javascript技巧

精简使用版本,一般情况好多cms都有一些这样的函数.dedecms中的选择相关文章也是用的这样的函数.下面给出具体的代码.父页面核心代码: 复制代码 代码如下: <script>function SelectArcListA(fname){ var posLeft = 10; var posTop = 10; window.open("content_select_list.asp?f="+fname+"&k="+form1.keyword.va