C# WINFORM窗体间通过委托和事件传值(自定义事件参数)--实例详解

本文首发于码友网–《C# WINFORM窗体间通过委托和事件传值(自定义事件参数)–实例详解
cc
在C# WINFORM的日常开发中,我们通常需要遇到跨窗体传值这一问题,实现的方式也是有很多的,今天给大家分享一种通过委托和事件来实现的传值方式。

不多说废话,我将用一个具体的实例来跟大家说明怎么样利用很委托和事件以及自定义的参数来实现跨窗体传值。例如:程序中我们有一个主窗体,其中文本框的值是我们需要从另外一个窗体中获取的,如图:

delegate-event-cross-winform-pass-valuestep-1

在这个表单窗体中,填写完整联系人地址信息后,我们希望把这些信息回传到主窗体中,如图:

delegate-event-cross-winform-pass-valuestep-2

最终,我们想让主窗体得到如下的数据:

delegate-event-cross-winform-pass-valuestep-3

好了,效果已展示,下面给大家放一下源代码。首先是赋值窗体,如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DelegatePassValue
{
  public partial class frmAddress : Form
  {
    //声明一个更新Address的委托
    public delegate void AddressUpdateHandler(object sender, AddressUpdateEventArgs e);
    //声明一个更新Address的事件
    public event AddressUpdateHandler AddressUpdated;

    public frmAddress()
    {
      InitializeComponent();
    }

    private void btnOk_Click(object sender, EventArgs e)
    {
      var args = new AddressUpdateEventArgs(txtCountry.Text, txtState.Text, txtCity.Text, txtZipCode.Text);
      AddressUpdated(this,args);
      this.Dispose();
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
      this.Dispose();
    }
  }

  public class AddressUpdateEventArgs : System.EventArgs
  {
    private string mCountry;
    private string mState;
    private string mCity;
    private string mZipCode;
    public AddressUpdateEventArgs(string sCountry, string sState, string sCity, string sZipCode)
    {
      this.mCountry = sCountry;
      this.mState = sState;
      this.mCity = sCity;
      this.mZipCode = sZipCode;
    }
    public string Country { get { return mCountry; } }
    public string State { get { return mState; } }
    public string City { get { return mCity; } }
    public string ZipCode { get { return mZipCode; } }
  }
}

其次,是主窗体(即要取得传递值的窗体),如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DelegatePassValue
{
  public partial class frmMain : Form
  {
    public frmMain()
    {
      InitializeComponent();
    }

    private void btnSetAddress_Click(object sender, EventArgs e)
    {
      var frmAddr = new frmAddress();
      frmAddr.AddressUpdated += new frmAddress.AddressUpdateHandler(AddressForm_ButtonClicked);
      frmAddr.Show();
    }

    private void AddressForm_ButtonClicked(object sender, AddressUpdateEventArgs e)
    {
      txtCountry.Text = e.Country;
      txtState.Text = e.State;
      txtCity.Text = e.City;
      txtZipCode.Text = e.ZipCode;
    }

    private void btnClose_Click(object sender, EventArgs e)
    {
      Application.Exit();
    }
  }
}

好了,到此本实例–C# WINFORM窗体间通过委托和事件传值(自定义事件参数)的实现就结束了,如果你对本站分享的内容有更好的建议或意见,欢迎给我留言,希望我们共同学习,进步,谢谢。

最后,如果你对本实例程序源码感兴趣,可以 从以下地址获取:

https://www.aliyundrive.com/s/C2J4fmeKpUD 提取码:9mz1
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
C# WinForm中,窗体互传数据可以通过多种方式实现。一种常用的方式是使用委托事件。以下是一种示例的实现方法: 首先,在发送数据的窗体类中定义一个委托事件,用于触发数据传递的动作。在代码的注释中,我使用了这个引用来说明代码的来源。 ```csharp // 在发送数据的窗体类中 public delegate void DataPassedHandler(Student student); // 声明一个委托 public event DataPassedHandler DataPassed; // 声明一个事件 // 在发送数据的动作中触发事件 private void btnSendData_Click(object sender, EventArgs e) { // 创建一个Student对象,设置属性值 Student student = new Student(); student.Name = "张三"; student.Age = 20; student.Six = "男"; student.ClaslRoom = "一班"; student.Hoppy = "篮球"; // 触发事件,将Student对象传递给订阅了该事件窗体 DataPassed?.Invoke(student); } ``` 然后,在接收数据的窗体类中订阅该事件,并编写事件处理方法。同样,我使用了这个引用来说明代码的来源。 ```csharp // 在接收数据的窗体类中 public void ReceiveData(Student student) { // 在这里处理接收到的数据 // 可以将接收到的数据显示在窗体的控件上,或者进行其他操作 // 例如,将数据显示在文本框中 txtName.Text = student.Name; txtAge.Text = student.Age.ToString(); txtSex.Text = student.Six; txtClass.Text = student.ClaslRoom; txtHobby.Text = student.Hoppy; } // 在窗体加载时订阅事件 private void Form2_Load(object sender, EventArgs e) { Form1 form1 = (Form1)this.Owner; // 获取父窗体实例 form1.DataPassed += ReceiveData; // 订阅事件 } ``` 通过以上的代码,你可以在发送数据的窗体中通过点击按钮来触发数据传递的动作,将Student对象传递给订阅了该事件窗体,在接收数据的窗体中处理接收到的数据。这样就实现了C# WinForm窗体的数据传递。<span class="em">1</span> #### 引用[.reference_title] - *1* [c#winform窗体如何实现数据的保存和读取](https://blog.csdn.net/weixin_64740767/article/details/128329504)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码老头

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值