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

本文转载: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
  

C# 1

贯彻思路:

frmParent窗体所于的模块依赖frmChildA所当模块,而frmChildA只依赖IMdiParent接口,这多亏《敏捷软件开发》中所提的乘倒置原则。最后,我们将IMdiParent接口部署于一个Common模块内,实际上frmParent与frmChildA只需要依赖Common模块。

相关文章