再谈C# Winforms桌面应用程序实现跨窗体间委托传值(实例)

2 篇文章 0 订阅

文章首发于 码友网《再谈C# Winforms桌面应用程序实现跨窗体间委托传值(实例)》

前言

关于C# Winforms桌面应用程序跨窗体传值其实是一个老生常谈的问题了。我之前在码友网也写过多篇C# Winforms桌面应用程序跨窗体传值的实例文章,比如:

《C# WINFORM窗体间通过委托和事件传值(自定义事件参数)–实例详解》
《C#/.NET WINFORM中使用委托和事件在类中更新窗体UI控件》

那为什么还要“再谈”C# Winforms桌面应用程序跨窗体委托传值呢?因为对于绝大多数C#&.NET新手来说,要学习并熟练掌握C#的委托,事件等是比较难的知识点,需要开发者不断地学习和项目实践。

并且,实现C# Winforms窗体间传值的方案也并不止一种,本文将为C#&.NET开发者们演示使用一种特殊的委托(delegate)–**Action**来实现的跨窗体传值实例。

效果预览

本实例主要演示的是联系人管理,其中包括新建联系人,联系人列表等功能。

实例的最终预览效果如下:

C# Winforms桌面应用程序实现跨窗体间委托(Action)传值预览效果

创建解决方案及项目

打开Visual Studio 2022,创建一个用于测试的解决方案,命名为:WindowsFormsApp1,再在解决方案中创建名为WindowsFormsApp1的项目。

分别新建三个Winform窗体:FrmMainFrmCreateFrmList 和一个联系人的类Contact.cs

联络人类(Contact.cs)定义如下:

using System;

namespace WindowsFormsApp1.Models
{
    /// <summary>
    /// 联系人
    /// </summary>
    public class Contact
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
        public string Email { get; set; }
    }
}

主窗体FrmMain.cs

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using WindowsFormsApp1.Models;

namespace WindowsFormsApp1
{
    public partial class FrmMain : Form
    {
        private List<Contact> _contacts;
        public FrmMain()
        {
            _contacts = new List<Contact>();
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var frm = new FrmCreate();
            frm.OnContactCreated = (contact) =>
            {
                _contacts.Add(contact);
            };
            frm.ShowDialog();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            var frm = new FrmList(_contacts);
            frm.ShowDialog();
        }
    }
}

在主窗体,【新建联系人】按钮事件中,创建了FrmCreate的实例frm,同时为frm实例设置了回调(委托)OnContactCreated这一步是委托传值的关键

新建联系人窗体 FrmCreate.cs

using System;
using System.Windows.Forms;
using WindowsFormsApp1.Models;

namespace WindowsFormsApp1
{
    public partial class FrmCreate : Form
    {
        public FrmCreate()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 联系人创建成功的回调(委托)
        /// </summary>
        public Action<Contact> OnContactCreated;
        private void btnSubmit_Click(object sender, EventArgs e)
        {
            var contact = new Contact
            {
                Id = Guid.NewGuid(),
                Name = textBox1.Text.Trim(),
                Email = textBox2.Text.Trim()
            };
            OnContactCreated?.Invoke(contact);
            Close();
        }
    }
}

在【新建联系人】窗体中,我们定义了联系人创建成功的回调(委托),当点击“保存联系人”按钮后,如果调用者设置了OnContactCreated回调,则会执行回调中的方法。其中,语句OnContactCreated?.Invoke(contact);是关键。

联系人列表窗体 FrmList.cs

using System.Collections.Generic;
using System.Windows.Forms;
using WindowsFormsApp1.Models;

namespace WindowsFormsApp1
{
    public partial class FrmList : Form
    {
        private List<Contact> _contacts;
        public FrmList(List<Contact> contacts)
        {
            _contacts = contacts;
            InitializeComponent();
        }

        private void FrmList_Load(object sender, System.EventArgs e)
        {
            dataGridView1.DataSource = _contacts;
        }
    }
}

如果你对本演示的源码感兴趣,请至原文获取。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码老头

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

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

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

打赏作者

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

抵扣说明:

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

余额充值