前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)

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

作者头像
跟着阿笨一起玩NET
发布2018-09-18 13:33:09
8K0
发布2018-09-18 13:33:09
举报

本文转载:http://www.csframework.com/archive/2/arc-2-20110805-1771.htm

文章侧重点主要是讨论“窗体”与“窗体”之间方法的调用,以及“MDI父窗体”与“Chilid子窗体”之间如何相互的调用方法。

C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用) 看似一个简单的功能需求,其实很多初学者处理不好的,很多朋友会这么写:

C# Code: //父窗体是是frmParent,子窗体是frmChildA //在父窗体中打开子窗体 frmChildA child = new frmChildA(); child.MdiParent = this; child.Show(); //子窗体调父窗体方法: //错误的调用!!!!!!!! (this.MdiParent as frmParent).ParentFoo(); //来源:C/S框架网(www.csframework.com) QQ:1980854898

知道错在那里吗?错在强依赖!如果父窗体与子窗体在同一个模块内看似没有错,因为这种反向引用在同一个模块内是可行的,但程序不能这么写,你把它写死了!固化了!假设我们的项目不断在扩展,需要将父窗体与子窗体分开在不同的模块,这段代码就完了!因为父窗体模块必须引用子窗体模块,而子窗体需要用到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)    { //调用子窗体的Foo()方法       Form activedChild = this.ActiveMdiChild;       if ((activedChild != null) && (activedChild is IMyChildForm))          (activedChild as IMyChildForm).Foo();    } #region IMdiParent 成员 public void ParentFoo()    {       MessageBox.Show("调用" this.GetType().FullName ".ParentFoo()方法!");    } #endregion } //来源:C/S框架网(www.csframework.com) QQ:1980854898

子窗体的代码:

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)    { //调用父窗体的ParentFoo()方法 if ((this.MdiParent !=null) && (this.MdiParentis IMdiParent))       (this.MdiParent as IMdiParent).ParentFoo();    } private void btnErrCall_Click(object sender, EventArgs e)    { //错误的调用       (this.MdiParent as frmParent).ParentFoo();    } //来源:C/S框架网(www.csframework.com) QQ:1980854898

贴图图片
贴图图片

实现思路: frmParent窗体所在的模块依赖frmChildA所在模块,而frmChildA只依赖IMdiParent接口,这正是《敏捷软件开发》中所讲的依赖倒置原则。最后,我们把IMdiParent接口部署在一个Common模块内,实际上frmParent与frmChildA只需要依赖Common模块。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-03-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档