关闭

子窗体和父窗体双向传值——C#窗体传值方法总结

标签: C#窗体传值
3446人阅读 评论(0) 收藏 举报
分类:

简介

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

方法1:Public字段+ShowDialog

原理

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

代码

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

/// <summary>
/// 给子窗体传值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></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 name="sender"></param>
/// <param name="e"></param>
private void btn_ShowFather_Click(object sender, RoutedEventArgs e)
{
    this.Title = "我要给父窗体传值";
    this.DialogResult = true;//第3步,首先会话结束
}

效果截图

  截图为证:
  父窗体→子窗体
  点击“给子窗体传值”
  这里写图片描述
  子窗体→父窗体
  点击“给父窗体传值”
  这里写图片描述

总结

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

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

原理

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

代码

  公共类代码  

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

  父窗体代码 

/// <summary>
/// 实例化子窗体,为公用类静态字段赋值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></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);
    }
}

  子窗体代码 

/// <summary>
/// 加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    this.Title = InfoClass.Title;
}

/// <summary>
/// 修改公共类的静态字段,变相为父窗体赋值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_ShowFather_Click(object sender, RoutedEventArgs e)
{
    InfoClass.Title = "我的名字也是来自公共类!";
    InfoClass.Message = "这是子窗体留下的信息!";
    this.DialogResult = true;
}

效果截图

  截图为证:
  父窗体→子窗体
  点击“给子窗体传值”
  这里写图片描述
  子窗体→父窗体
  点击“给父窗体传值”
  这里写图片描述
  

总结

方法3:构造函数+委托(我认为最好的方法)

原理

  这个方法的原理就是:
  1.父窗体利用子窗体的构造函数向子窗体传值;
  2.自定义子窗体的构造函数,函数签名包含一个委托函数;
  3.在子窗体中调用来自父窗体传递的委托函数,对对父窗体进行传值。

代码

  委托代码
  这个方法需要用到委托函数,我们将委托函数单独定义在公共类文件里面。
  代码如下:

public delegate void ShowMessage(string value);

  父窗体代码
  

/// <summary>
/// 通过自定义构造函数,给子窗体传值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_ShowChild_Click(object sender, RoutedEventArgs e)
{
    ChildWindow child = new ChildWindow(ShowErrorMessage,"这是来自父窗体的信息");
    child.Show();
}

/// <summary>
/// 符合委托函数ShowMessage返回类型和签名的函数实例
/// </summary>
/// <param name="value"></param>
private void ShowErrorMessage(string value)
{
    MessageBox.Show(value,"父窗体提示框");
}

  子窗体代码

ShowMessage sm;
string value="";
public ChildWindow(ShowMessage _sm,string _value)
{
    InitializeComponent();
    sm = _sm;
    value = _value;
}

/// <summary>
/// 加载事件,显示父窗体传递来的值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Window_Loaded(object sender, RoutedEventArgs e)
{
    MessageBox.Show(value, "子窗体提示框");
}


/// <summary>
/// 调用父窗体传来的委托函数,给父窗体传值
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_ShowFather_Click(object sender, RoutedEventArgs e)
{
    sm.Invoke("这是来自子窗体的信息!");
}

效果截图

  截图为证:
  
  父窗体→子窗体
  点击“给子窗体传值”
  这里写图片描述
  子窗体→父窗体
  点击“给父窗体传值”
  这里写图片描述
  

总结

  优点:能够在不关闭子窗体的情况下实现两个窗体间的传值(而且不仅限于传值),灵活方便,功能强大;
  缺点:需要对委托有一定的了解,使用起来需要对这个方法有一定的理解;

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

子窗体传值给父窗体传值

  • 2010-05-15 16:39
  • 40KB
  • 下载

关于WPF的两个窗口之间简单的数据传递

关于WPF的两个窗口之间简单的数据传递
  • u010637394
  • u010637394
  • 2015-02-01 16:53
  • 4793

C#(Winfrom)窗体传值问题(子窗体回传值给父窗体)

Form1 -------------------------------------------- using System; using System.Collections.Generic...
  • PressTab
  • PressTab
  • 2015-04-12 14:20
  • 1126

C# 子窗体传值给父窗体

  • 2017-04-21 18:47
  • 38KB
  • 下载

C#的Winform窗体之间的传值

本人做Winform比较少,所以关于Winform窗体间的传值方式知道的也就这么几种。 1.通过构造函数进行传值。 实现代码如下: 在窗体Form2中 int value1; ...
  • a631464421
  • a631464421
  • 2015-03-26 21:04
  • 4390

C# 利用委托实现窗体间传值

图文详解C#窗体间传递数据 ——窗口1若干TextBox中的数据,传递到窗口2中的ListView 功能描述:主窗体有一ListView控件和一“添加”Button控件。点击“添加”But...
  • jiliqiang1986
  • jiliqiang1986
  • 2017-03-06 12:08
  • 2239

子窗体和父窗体双向传值——C#窗体传值方法总结

简介  在很多场景下,我们的程序需要完成窗体间的传值功能,有时候是父窗体→子窗体单向传值、子窗体→父窗体传值甚至是,也有时候我们需要父窗体⇆子窗体双向传值。   在本文中主要介绍一些能够实现双向传值...
  • honantic
  • honantic
  • 2015-05-29 11:54
  • 3446

java swing: JFrame 父子窗口之间如何传值

利用窗体的引用传值。 父窗口:MainUI 子窗口:CreateTaskUI   父窗口有一个TextArea ta, Button create。 点击父窗口的create button,...
  • youran02100210
  • youran02100210
  • 2017-04-11 10:18
  • 1812

asp.net 子窗口的值传到父窗口中

在winform程序中经常用到这样一个功能:弹出一个子窗口,在子窗口中完成选择或计算,然后把选择或计算的结果返回给父窗口。这个功能在winform程序中很容易实现,那么在web程序中怎么实现这个功能呢...
  • zlwzlwzlw
  • zlwzlwzlw
  • 2013-11-18 16:50
  • 3647

C# 子窗体向父窗体的控件传值

  • 2013-07-15 00:04
  • 932B
  • 下载
    个人资料
    • 访问:875044次
    • 积分:5122
    • 等级:
    • 排名:第6273名
    • 原创:55篇
    • 转载:8篇
    • 译文:7篇
    • 评论:44条
    最新评论