winform 透明窗体一个窗体触发另一个窗体的LOAD

C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)|C/S框架网|C# C/S框架|Winform 框架|.Net开发框架
&|&&|&C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)
C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)
作者:C/S框架网&&发布日期: 21:43:49
C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)看似一个简单的功能需求,其实很多初学者处理不好的,很多朋友会这么写:
C# Code://父窗体是是frmParent,子窗体是frmChildA frmChildA child = new frmChildA();child.MdiParent = this;child.Show();//子窗体调父窗体方法://错误的调用!!!!!!!!(this.MdiParent as frmParent).ParentFoo();知道错在那里吗?错在强依赖!如果父窗体与子窗体在同一个模块内看似没有错,因为这种反向引用在同一个模块内是可行的,但程序不能这么写,你把它写死了!固化了!假设我们的项目不断在扩展,需要将父窗体与子窗体分开在不同的模块,这段代码就完了!因为父窗体模块必须引用子窗体模块,而子窗体需要用到frmParent的类,又要引用父窗体的模块!这时构成了双向引用,编译不能通过,所以讲程序写死了!有什么办法解除这种依赖关系呢?办法是有的,就是使用接口解除依赖关系!我们把程序改下:
C# Code:&summary& 主窗体接口 &/summary& public interface IMdiParent{&&&void ParentFoo();}&summary& 子窗体接口 &/summary& public interface IMyChildForm{&&&void Foo();}主窗体的代码:
C# Code:&summary& 主窗体,实现IMdiParent接口 &/summary& public partial class frmParent : Form, IMdiParent{&&&public frmParent()&&&{&&&&&&InitializeComponent();&&&}&&&&&&private void form1ToolStripMenuItem_Click(object sender, EventArgs e)&&&{&&&&&& &&&&&&frmChildA child = new frmChildA();&&&&&&child.MdiParent = this;&&&&&&child.Show();&&&}&&&&&&private void menuCallFoo_Click(object sender, EventArgs e)&&&{&&&&&& &&&&&&Form activedChild = this.ActiveMdiC&&&&&&if ((activedChild != null) && (activedChild is IMyChildForm))&&&&&&&& (activedChild as IMyChildForm).Foo();&&&}&&&&&&#region IMdiParent 成员&&&&&&public void ParentFoo()&&&{&&&&&&MessageBox.Show("调用" this.GetType().FullName ".ParentFoo()方法!");&&&}&&&&&&#endregion}子窗体的代码:
C# Code:&summary& 子窗体,实现IMyChildForm接口 &/summary& public partial class frmChildA : Form, IMyChildForm{&&&public frmChildA()&&&{&&&&&&InitializeComponent();&&&}&&&&&&#region IMyChildForm 成员&&&&&&public void Foo()&&&{&&&&&&MessageBox.Show("调用" this.GetType().FullName ".Foo()方法!");&&&}&&&&&&#endregion&&&&&&private void btnParentFoo_Click(object sender, EventArgs e)&&&{&&&&&& &&&&&&if ((this.MdiParent != null) && (this.MdiParent is IMdiParent))&&&&&&(this.MdiParent as IMdiParent).ParentFoo();&&&}&&&&&&private void btnErrCall_Click(object sender, EventArgs e)&&&{&&&&&& &&&&&&(this.MdiParent as frmParent).ParentFoo();&&&}&&&&&&&&&实现思路:frmParent窗体所在的模块依赖frmChildA所在模块,而frmChildA只依赖IMdiParent接口,这正是《敏捷软件开发》中所讲的依赖倒置原则。最后,我们把IMdiParent接口部署在一个Common模块内,实际上frmParent与frmChildA只需要依赖Common模块。Source Code for VS2008:
(如下载失败,请通知我们寄回给您,或QQ:留言.)
相关资料:&|&&|&&|&&|&&|&&|&&|&&|&&关闭子窗体后form2.Closed&+=&(ss,ee)=&&{&this.Close();&};或Application.OpenForms集合找到要关闭的窗口,再Close:foreach&(var&item&in&Application.OpenForms){&&if&(item&is&Form1)&item.Close();}
B&new_form&=&new&B();new_form.owner&=&this.hide();new_form.showdialog();Application.ExitThread();Application.ExitThread();是退出当前线程。首先默认情况下我们的程序是单线程的,this.hide();后把当前窗体隐藏起来了,然后new_form.showdialog();模态弹出新窗口。这个时候线程不会继续执行(被阻塞了),直到我们关闭了新弹出来的模态窗口后,程序才会继续执行Application.ExitThread();此时线程关闭,所有一切都关闭了,隐藏的窗口也关闭了。
Views(...) Comments()33386人阅读
WinCE开发(4)
&&& 先申明下,此文适合和我差不多的菜鸟学习,没有什么高深知识点,不想耽误老鸟们的宝贵时间,如果有什么专业术语不对的还请指正啊。
&&& 最近进行WinCE的开发,第一次实际做C/S架构的项目,其中遇到很多问题。这个问题使我记忆深刻,当时在谷歌中搜索了好久都没找到想要的答案,用的就是文章标题中的原话。然后又换成“WinForm中子窗体调用父窗体的控件和事件的方法”,搜到的还是不太多。但我发现原来这个可以用委托与事件来解决(说来惭愧,后来问了一个同学,她说这个以前老师讲过,好吧,我承认上学时划水了)。
&&& 假设现在我有一个主窗体Form1,现想在另外两个窗体Form2,Form3中运用不同的方法来实现:修改Form2,Form3中的numericUpDown的值时Form1中textbox值随之改变。
先讲第一种方法,直接将整个窗体作为参数传给另一个窗体。
这是Form1中的代码:
public partial class Form1 : Form
public Form1()
InitializeComponent();
//第一种方法示例事件
public void changetext(string s)
this.textBox1.Text =
//第一种方法
private void button1_Click(object sender, EventArgs e)
//将整个窗体作为值传给Form2
var frm2 = new Form2(this);
frm2.ShowDialog();
private void Form1_Load(object sender, EventArgs e)
这是Form2中代码:
public partial class Form2 : Form
//这是第一种方法
private Form1 f1;
public Form2()
InitializeComponent();
public Form2(Form1 frm1)
InitializeComponent();
f1 = frm1;//将传过来的Form1全部赋值给f1,这样就可以在这边调用Form1了
private void Form2_Load(object sender, EventArgs e)
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
//这是第一种方法
//调用Form1中的changetext事件
f1.changetext(numericUpDown1.Value.ToString());
}第二种方法,使用委托与事件(推荐)
委托与事件的概念这里就不讲了,如果有兴趣,大家可以去看看张子阳的博客,。
Form1中代码:
public partial class Form1 : Form
public Form1()
InitializeComponent();
private void Form1_Load(object sender, EventArgs e)
//改变值的事件
private void frm2_changed(string s)
//此处是给原有窗体中控件赋值
this.textBox1.Text = s +
//清空值的事件
private void frm3_empty(string s)
this.textBox1.Text = &&;
private void button2_Click(object sender, EventArgs e)
var frm3 = new Form3();
//这是委托与事件的第二步,
//写到+=时,按两次Tab键会自动生成frm2_changed,frm3_empty两个事件
frm3.changed += new Form3.Form2Handle(frm2_changed);//改变值的事件
frm3.empty += new Form3.Form2Handle(frm3_empty);//清空值的事件
frm3.ShowDialog();
}Form3中代码:
public partial class Form3 : Form
//定义带参数的委托与两个事件
//这是委托与事件的第一步
public delegate void Form2Handle(string s);
public event Form2H
public event Form2H
public Form3()
InitializeComponent();
private void Form3_Load(object sender, EventArgs e)
private void numericUpDown1_ValueChanged(object sender, EventArgs e)
//这是委托与事件的第三步
changed(numericUpDown1.Value.ToString());
private void button1_Click(object sender, EventArgs e)
empty(numericUpDown1.Value.ToString());
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:517901次
积分:5362
积分:5362
排名:第5289名
原创:141篇
转载:25篇
评论:66条
阅读:163924
(1)(1)(5)(2)(2)(1)(2)(1)(2)(1)(1)(4)(3)(1)(3)(3)(1)(9)(11)(99)(13)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'winform怎么在关闭一个窗体后显示另一个窗体?
作者:用户
浏览:123 次
关闭窗体我知道有:窗体.Close();和窗体.Dispose();这样按下关闭后整个程序都关了,我不是想要这样的效果,而是在这个关闭之后另外一个能生成?###把原来的窗体隐藏,把新的窗体表现出来例如
问题描述关闭窗体我知道有:窗体.Close();和窗体.Dispose();这样按下关闭后整个程序都关了,我不是想要这样的效果,而是在这个关闭之后另外一个能生成?解决方案解决方案二:把原来的窗体隐藏,把新的窗体表现出来例如你现在打开的是Form1还有一个窗体是Form2frm1.hide();form2frm2=newfrom();frm2.show();解决方案三:不要close(),用户hide()解决方案四:如果你想弄类似登录窗体和主界面的窗体,可以先加载主窗体,然后在主窗体的load事件里添加打开登录窗体,如果登录窗体成功继续加载后面代码,如果登录没满足要求就一直在登录窗体,或者程序退出解决方案五:可以在Form的Closed事件里边写你的需要加载另外的窗体的逻辑解决方案六:privateForm2f2;privateForm3f3;privatevoidbutton1_Click(objectsender,EventArgse){f2=newForm2();f2.Show();}privatevoidbutton2_Click(objectsender,EventArgse){f3=newForm3();f2.Close();//关闭F2f3.Show();}解决方案七:frm1.hide();form2frm2=newfrom();frm2.show();解决方案八:点解决方案资源管理,里面有个Program.cs类,点开它,在Main方法里有这样一行代码Application.Run(newForm1());这是一个系统的静态类Application的一个Run方法,为了实现程序第一个启动的的程序,里面写的newForm1()就是启动了一个Form1的对象,这也就是每次我们程序点调试时候会第一个弹出Form1窗口的原因。为了实现你提到的问题,我们可以把Application.Run(newForm1());发放里的newForm1();给去掉,然后在其前面手动把Form1给Show出来;Program这个类的代码改成如下:usingSusingSystem.Collections.GusingSystem.Windows.FnamespaceWindowsApplication1{staticclassProgram{//////应用程序的主入口点。///[STAThread]staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Form1f1=newForm1();f1.Show();Application.Run();}}}这样就可以解决你说的问题了不过this.Hide();是隐藏了这个窗口,而不是关闭;解决方案九:3楼的做法点赞解决方案十:我大一的时候做过一个类似的,不过我那时候没想到三楼的办法,我是添加了个主菜单新进程,然后登陆窗口那边的退出用的Application.ExitThread();退出当前线程上的所有消息循环,并结束当前线程上所有窗口,这样就不会发生你退出登陆窗口之后主菜单自动显示出来的事了,不过推荐三楼的做法解决方案十一:Form1改成要打开的窗体ThreadShowMainThread=newThread(newThreadStart(delegate{System.Windows.Forms.Application.Run(newForm1());}));ShowMainThread.ApartmentState=ApartmentState.STA;ShowMainThread.Start();关闭当前窗体this.Close();this.Dispose();解决方案十二:我能想到方法都有人回答了,呵呵解决方案十三:staticclassProgram{//直接上代码,不知道是否能实现你的要求publicstaticApplicationContextAppCpublicstaticboolisClose=///&summary&///应用程序的主入口点。///&/summary&[STAThread]staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Form1frm=newForm1();AppContext=newApplicationContext(frm);AppContext.ThreadExit+=newEventHandler(AppContext_ThreadExit);Application.Run(AppContext);}staticvoidAppContext_ThreadExit(objectsender,EventArgse){if(!Program.isClose){Form2frm=newForm2();frm.FormClosed+=newFormClosedEventHandler(frm_FormClosed);AppContext.MainForm=frm.ShowDialog();}}staticvoidfrm_FormClosed(objectsender,FormClosedEventArgse){Program.isClose=}}解决方案十四:button1.Enabled=//这个是重点,禁用之后跟上这一行代码即可。Application.DoEvents();//windows会先执行你之前的请求然后再执行你后面的方法//你的业务操作...button1.Enabled=解决方案十五:因为你的form1是主窗体你在program类里能看到这样的代码:Application.Run(newform1());所以form1关闭后,整个程序就退出了.解决办法1.要么form1不要作为主窗体,而让你真正的主窗体作为主窗体,主窗体打开后以模态窗体的形式打开form1,不登陆不许操作.2.要么form1不要关闭,而是hide,不过这样会一直占着一部分内存,不推荐3.用Application.Run(newform2());来打开另一个窗体,这样你相当于另开启了一个主线程,跟你当前线程就无关了,不会因为form1关闭了而让整个程序退出解决方案:在显示窗口的Load事件中使用委托事件关闭点击窗体。
【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所&&
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
6款热门基础云产品6个月免费体验;2款产品1年体验;1款产品2年体验
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
开发者常用软件,超百款实用软件一站式提供}

我要回帖

更多关于 winform跳转窗体 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信