当前位置:首页 > Windows程序 > 正文

子窗体和父窗体双向传值

2021-05-26 Windows程序

  在很多场景下,我们的程序需要完成窗体间的传值功能,有时候是父窗体→子窗体单向传值、子窗体→父窗体传值甚至是,也有时候我们需要父窗体?子窗体双向传值。
  在本文中主要介绍一些能够实现双向传值的方法,能够双向传值的方法也能够实现单向传值。
  本文的所有源码都可以在GitHub上下载。
  
  本文介绍的方法仅限于我自己知道并且实现过的,我相信还有很多我并不知道的方法,因此也许在很多朋友眼中本文的内容是浅显甚至可笑的,希望路过的各方朋友不吝赐教,我也希望不断地进步!

方法1:Public字段+ShowDialog 原理

  这个方法的原理就是:
  1.父窗体在实例化子窗体对象(假定名为childWindow)的时候,通过对子窗体Public字段进行赋值的方法,完成父窗体→子窗体的传值;
  2.父窗体实例化子窗体后,调用子窗体的childWindow.ShowDialog()方法;
  3.随后在父窗体中对childWindow.DialogResult的值进行判断,当会话结束的时候,将childWindow的字段值传给父窗体,实现子窗体→父窗体的传值。

代码

  示例代码:
  父窗体为MainWindow,子窗体为ChildWindow,我们将两个窗体间Title字段值进行互传。逻辑代码我们都放在了窗体的按钮点击事件中,用按钮来触发。
  
  父窗体代码:

/// <summary> /// 给子窗体传值 /// </summary> /// <param></param> /// <param></param> private void btn_ShowChild_Click(object sender, RoutedEventArgs e) { ChildWindow child = new ChildWindow() { Title="我的名字是父窗体给的!" };//第1步,给子窗体传值了 child.ShowDialog();//第2步,调用ShowDialog if (child.DialogResult==true)//第3步,然后对DialogResult进行判断 { this.Title = child.Title;//子窗体给父窗体传值 } }

  子窗体代码  

/// <summary> /// 给父窗体传值 /// </summary> /// <param></param> /// <param></param> private void btn_ShowFather_Click(object sender, RoutedEventArgs e) { this.Title = "我要给父窗体传值"; this.DialogResult = true;//第3步,首先会话结束 } 效果截图

  截图为证:
  父窗体→子窗体
  点击“给子窗体传值”
  

技术分享


  子窗体→父窗体
  点击“给父窗体传值”
  

技术分享

总结

  优点:这种方法简单方便,可以实现子窗体和父窗体间互相传值;
  缺点:不够灵活,子窗体和父窗体都需要承载中间值的对象,而且需要借助ShowDialog()和DialogResult。

方法2:公共类的静态字段 原理

  这个方法的原理就是:父窗体和子窗体分别对同一公共类的静态字段(可以是同一个字段也可以是不同的字段)进行赋值,然后父窗体和子窗体各自获取这些字段的值,,就能够实现窗体间的传值。
  该方法同样需要借助到ShowDialog()和DialogResult。

代码

  公共类代码  

/// <summary> /// 公共类 /// </summary> /// <param></param> /// <param></param> public class InfoClass { public static string Title { get; set; } public static string Message { get; set; } }

  父窗体代码 

/// <summary> /// 实例化子窗体,为公用类静态字段赋值 /// </summary> /// <param></param> /// <param></param> private void btn_ShowChild_Click(object sender, RoutedEventArgs e) { InfoClass.Title = "我的名字来自公共类!"; ChildWindow child = new ChildWindow(); child.ShowDialog(); if (child.DialogResult==true) { this.Title=InfoClass.Title; MessageBox.Show(InfoClass.Message); } }

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/71573.html