WinForm中父窗体与子窗体之间的相互传值

1、前言

WinForm开发中,窗体之间的相互传值是一项基本操作,本文就来介绍一下实现方法。

2、父窗体传值给子窗体

父窗体传值给子窗体比较简单,可以利用构造函数、属性、自定义函数实现。新建一个WinForm项目,创建父窗体MainForm和子窗体ChildForm,如下图所示:

在这里插入图片描述

MainForm界面如下所示:

在这里插入图片描述
ChildForm界面如下所示:

在这里插入图片描述

2.1、构造函数传值

MainForm代码如下:

using System;
using System.Windows.Forms;

namespace App
{
    public partial class MainForm : Form
    {
        private ChildForm childForm;

        public MainForm()
        {
            InitializeComponent();
        }

        private void btn_Click(object sender, EventArgs e)
        {
            if (childForm == null || childForm.IsDisposed)
            {
                childForm = new ChildForm(txtName.Text);
                childForm.Show();
            }
        }
    }
}

ChildForm代码如下:

using System.Windows.Forms;

namespace App
{
    public partial class ChildForm : Form
    {
        public ChildForm(string currentText)
        {
            InitializeComponent();
            lblName.Text = currentText;
        }
    }
}

2.2、属性传值

MainForm代码如下:

using System;
using System.Windows.Forms;

namespace App
{
    public partial class MainForm : Form
    {
        private ChildForm childForm;

        public MainForm()
        {
            InitializeComponent();
        }

        private void btn_Click(object sender, EventArgs e)
        {
            if (childForm == null || childForm.IsDisposed)
            {
                childForm = new ChildForm();
                childForm.CurrentText = txtName.Text;
                childForm.Show();
            }
        }
    }
}

ChildForm代码如下:

using System.Windows.Forms;

namespace App
{
    public partial class ChildForm : Form
    {
        public string CurrentText
        {
            get { return lblName.Text; }
            set { lblName.Text = value; }
        }

        public ChildForm()
        {
            InitializeComponent();
        }
    }
}

2.3、自定义函数传值

MainForm代码如下:

using System;
using System.Windows.Forms;

namespace App
{
    public partial class MainForm : Form
    {
        private ChildForm childForm;

        public MainForm()
        {
            InitializeComponent();
        }

        private void btn_Click(object sender, EventArgs e)
        {
            if (childForm == null || childForm.IsDisposed)
            {
                childForm = new ChildForm();
                childForm.SetText(txtName.Text);
                childForm.Show();
            }
        }
    }
}

ChildForm代码如下:

using System.Windows.Forms;

namespace App
{
    public partial class ChildForm : Form
    {
        public ChildForm()
        {
            InitializeComponent();
        }

        public void SetText(string currentText)
        {
            lblName.Text = currentText;
        }
    }
}

以上三种方法的效果是一样的,如下图所示:

在这里插入图片描述

3、子窗体传值给父窗体

子窗体传值给父窗体需要使用委托和事件实现。新建一个WinForm项目,创建父窗体MainForm和子窗体ChildForm,如下图所示:

在这里插入图片描述
MainForm界面如下所示:

在这里插入图片描述

ChildForm界面如下所示:

在这里插入图片描述

3.1、自定义委托

MainForm代码如下:

using System;
using System.Windows.Forms;

namespace App
{
    public partial class MainForm : Form
    {
        private ChildForm childForm;

        public MainForm()
        {
            InitializeComponent();
        }

        private void btn_Click(object sender, EventArgs e)
        {
            if (childForm == null || childForm.IsDisposed)
            {
                childForm = new ChildForm();
                childForm.handler = new SetTextEventHandler(SetText);
                childForm.Show();
            }
        }

        private void SetText(string text)
        {
            lblName.Text = text;
        }
    }
}

ChildForm代码如下:

using System.Windows.Forms;

namespace App
{
    public delegate void SetTextEventHandler(string text);

    public partial class ChildForm : Form
    {
        public SetTextEventHandler handler;

        public ChildForm()
        {
            InitializeComponent();
        }

        private void btn_Click(object sender, System.EventArgs e)
        {
            if (handler != null)
            {
                handler(txtName.Text);
            }
        }
    }
}

3.2、自定义委托+事件

MainForm代码如下:

using System;
using System.Windows.Forms;

namespace App
{
    public partial class MainForm : Form
    {
        private ChildForm childForm;

        public MainForm()
        {
            InitializeComponent();
        }

        private void btn_Click(object sender, EventArgs e)
        {
            if (childForm == null || childForm.IsDisposed)
            {
                childForm = new ChildForm();
                childForm.handler += new SetTextEventHandler(SetText);
                childForm.Show();
            }
        }

        private void SetText(string text)
        {
            lblName.Text = text;
        }
    }
}

ChildForm代码如下:

using System.Windows.Forms;

namespace App
{
    public delegate void SetTextEventHandler(string text);

    public partial class ChildForm : Form
    {
        public event SetTextEventHandler handler;

        public ChildForm()
        {
            InitializeComponent();
        }

        private void btn_Click(object sender, System.EventArgs e)
        {
            if (handler != null)
            {
                handler(txtName.Text);
            }
        }
    }
}

3.3、内置委托

MainForm代码如下:

using System;
using System.Windows.Forms;

namespace App
{
    public partial class MainForm : Form
    {
        private ChildForm childForm;

        public MainForm()
        {
            InitializeComponent();
        }

        private void btn_Click(object sender, EventArgs e)
        {
            if (childForm == null || childForm.IsDisposed)
            {
                childForm = new ChildForm();
                childForm.handler = new Action<string>(SetText);
                childForm.Show();
            }
        }

        private void SetText(string text)
        {
            lblName.Text = text;
        }
    }
}

ChildForm代码如下:

using System;
using System.Windows.Forms;

namespace App
{
    public partial class ChildForm : Form
    {
        public Action<string> handler;

        public ChildForm()
        {
            InitializeComponent();
        }

        private void btn_Click(object sender, System.EventArgs e)
        {
            if (handler != null)
            {
                handler(txtName.Text);
            }
        }
    }
}

3.4、内置委托+事件

MainForm代码如下:

using System;
using System.Windows.Forms;

namespace App
{
    public partial class MainForm : Form
    {
        private ChildForm childForm;

        public MainForm()
        {
            InitializeComponent();
        }

        private void btn_Click(object sender, EventArgs e)
        {
            if (childForm == null || childForm.IsDisposed)
            {
                childForm = new ChildForm();
                childForm.handler += new Action<string>(SetText);
                childForm.Show();
            }
        }

        private void SetText(string text)
        {
            lblName.Text = text;
        }
    }
}

ChildForm代码如下:

using System;
using System.Windows.Forms;

namespace App
{
    public partial class ChildForm : Form
    {
        public event Action<string> handler;

        public ChildForm()
        {
            InitializeComponent();
        }

        private void btn_Click(object sender, System.EventArgs e)
        {
            if (handler != null)
            {
                handler(txtName.Text);
            }
        }
    }
}

以上四种写法的效果是一样的,如下图所示:

在这里插入图片描述

4、结语

窗体传值是WinForm中的基础问题,因此开发者需要熟练掌握委托、事件、属性的使用方法。

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值