• 【窗体】Winform两个窗体之间通过委托事件进行值传递,基础篇


    2023年,第38周。给自己一个目标,然后坚持总会有收货,不信你试试!
    在实际项目中,我们可能会用到一些窗体做一些小工具或者小功能。比如:运行程序,在主窗体A基础上,点击某个按钮希望能够弹出B窗体,
    在B窗体完成操作后,希望能够把值传递回到A窗体,然后进行其他业务操作。

    在这里插入图片描述

    一、显示线上图片

    要在C# WinForm中动态为PictureBox控件赋值图片链接,你可以使用Image.FromUrl方法来加载远程图片,并将其分配给PictureBox的Image属性。

    • 下面是一个简单的示例代码:

    首先,在你的WinForm窗体上添加一个PictureBox控件。

    然后,在窗体的代码文件中,添加以下引用:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Net;
    
    • 1
    • 2
    • 3
    • 4

    接下来,在你想赋值图片链接的事件中(如按钮点击事件),添加以下代码:

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            // 获取图片链接
            string imageUrl = "https://example.com/image.jpg"; // 替换为你的图片链接
    
            // 使用WebClient下载图片
            WebClient client = new WebClient();
            byte[] imageData = client.DownloadData(imageUrl);
            MemoryStream ms = new MemoryStream(imageData);
    
            // 创建并分配图片给PictureBox
            Image image = Image.FromStream(ms);
            pictureBox1.Image = image;
        }
        catch (Exception ex)
        {
            // 处理异常
            MessageBox.Show("加载图片时出错:" + ex.Message);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在上述示例中,我们使用WebClient来下载图片数据,并将其转换为Image对象。
    然后,我们将该图像分配给PictureBox的Image属性,这样就可以在窗体上显示图片了。

    注意,为了正常运行示例,请确保你的应用程序能够访问指定的图片链接。

    二、显示本地图片

    要在C# WinForm中加载本地图片到PictureBox控件,你可以使用Image.FromFile方法来加载本地图片文件,并将其分配给PictureBox的Image属性。

    • 下面是一个简单的示例代码:

    首先,在你的WinForm窗体上添加一个PictureBox控件。

    然后,在窗体的代码文件中,添加以下引用:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    • 1
    • 2
    • 3

    接下来,在你想加载本地图片的事件中(如按钮点击事件),添加以下代码:

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            // 获取本地图片文件路径
            string imagePath = "C:\\path\\to\\your\\image.jpg"; // 替换为你的图片文件路径
    
            // 加载本地图片文件
            Image image = Image.FromFile(imagePath);
    
            // 将图片分配给PictureBox
            pictureBox1.Image = image;
        }
        catch (Exception ex)
        {
            // 处理异常
            MessageBox.Show("加载图片时出错:" + ex.Message);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在上述示例中,我们使用Image.FromFile方法加载指定路径的图片文件,并将其转换为Image对象。
    然后,我们将该图像分配给PictureBox的Image属性,从而在窗体上显示图片。

    请注意,替换示例代码中的imagePath为你实际的本地图片文件路径。

    三、A窗体打开B窗体

    在C# WinForm中打开另一个窗体,你可以使用Form类的实例来创建一个新的窗体,并调用其ShowShowDialog方法来显示它。

    • 下面是一个简单的示例代码:

    假设你已经创建了两个窗体:Form1Form2

    Form1窗体中,你可以添加一个按钮,在按钮的点击事件中打开Form2窗体。代码如下:

    private void button1_Click(object sender, EventArgs e)
    {
        // 创建Form2窗体实例
        Form2 form2 = new Form2();
    
        // 显示Form2窗体
        form2.Show();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    如果你希望以模态的方式打开另一个窗体,即Form2完全显示后才能继续操作Form1,你可以使用ShowDialog方法。

    • 示例代码如下:
    private void button1_Click(object sender, EventArgs e)
    {
        // 创建Form2窗体实例
        Form2 form2 = new Form2();
    
        // 以模态方式显示Form2窗体
        form2.ShowDialog();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在上述示例中,我们首先创建了要打开的窗体实例,然后调用Show方法或ShowDialog方法来显示该窗体。

    四、事件机制传递值

    要将从B窗体选择的值传递给A窗体,你可以通过以下几种方式实现:

    4.1、订阅事件

    在B窗体中定义一个属性或字段,用于保存所选的值。当B窗体关闭时,将选定的值传递回A窗体。

    在B窗体的代码中,可以定义一个公共属性或字段来保存所选的值:

    public string SelectedValue { get; set; }
    
    • 1

    在B窗体中的事件(如按钮点击事件)中,将所选的值赋给SelectedValue

    private void button1_Click(object sender, EventArgs e)
    {
        SelectedValue = comboBox1.SelectedItem.ToString();
        this.Close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在A窗体的代码中,创建B窗体的实例,并订阅B窗体的FormClosing事件来获取所选的值:

    private void button1_Click(object sender, EventArgs e)
    {
        BForm bForm = new BForm();
        bForm.FormClosing += (s, args) =>
        {
            if (!string.IsNullOrEmpty(bForm.SelectedValue))
            {
                // 使用bForm.SelectedValue在A窗体中进行操作
                MessageBox.Show(bForm.SelectedValue);
            }
        };
        bForm.ShowDialog();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.2、事件机制

    使用委托(Delegate)和事件(Event)机制来传递值。

    在B窗体的代码中,首先定义一个委托和事件:

    public delegate void ValueSelectedEventHandler(string selectedValue);
    public event ValueSelectedEventHandler ValueSelected;
    
    • 1
    • 2

    在B窗体中的事件(如按钮点击事件)中,触发事件并传递所选的值:

    private void button1_Click(object sender, EventArgs e)
    {
        string selectedValue = comboBox1.SelectedItem.ToString();
        ValueSelected?.Invoke(selectedValue);
        this.Close();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在A窗体的代码中,创建B窗体的实例,并订阅B窗体的事件来获取所选的值:

    private void button1_Click(object sender, EventArgs e)
    {
        BForm bForm = new BForm();
        bForm.ValueSelected += (selectedValue) =>
        {
            // 使用selectedValue在A窗体中进行操作
            MessageBox.Show(selectedValue);
        };
        bForm.ShowDialog();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    通过上述方法之一,你可以在A窗体中获取从B窗体选择的值,并在需要的地方进行操作。

    五、基础概念

    在 C# 中,委托(Delegate)、事件(Event)、消息(Message)、发布(Publish)和订阅(Subscribe)是几个相关的概念,它们之间有一些关系和联系。

    • 下面简要介绍它们之间的关系:

    5.1、委托(Delegate)

    委托是一种类型,它可以引用一个或多个方法,并允许通过委托调用这些方法。委托提供了一种将方法作为参数传递的机制,并允许以回调的方式进行函数调用。

    5.2、事件(Event)

    事件是基于委托的机制,用于实现一种对象间的通信和互动。对象可以将事件定义为其成员,并在特定条件下引发(触发)事件。其他对象可以订阅(或注册)事件,以便在事件发生时接收通知并执行相应的处理方法。

    5.3、消息(Message)

    消息是一种用于对象之间交换数据和信息的机制。它在不同的组件之间传递,以触发相应的行为或操作。消息可以是同步或异步的,可以包含参数、事件或其他数据。

    5.4、发布(Publish)和订阅(Subscribe)

    发布-订阅模式是一种软件设计模式,用于实现对象之间的解耦和松散耦合。在该模式中,一个对象(发布者)通知其他对象(订阅者)发生了某个事件或发出了某个消息,订阅者可以选择性地接收并处理这些事件或消息。

    在 C# 中,通常通过定义委托和事件来实现发布-订阅模式,发布者发布事件,而订阅者订阅并处理事件。
    事件是一种特殊类型的委托,它可以提供更高级别的封装和安全性。

    通过委托和事件,可以实现对象之间的松耦合通信,以实现更灵活、可扩展和可维护的代码结构。

  • 相关阅读:
    vue2+element-ui实现一个注册表单
    30分钟部署一个kubernetes集群【1.15】
    函数式接口@FunctionalInterface
    dice loss
    DolphinScheduler 进阶(资源中心)
    协同云办公原来可以这么简单!只需掌握这5个技巧
    计算机毕业设计ssm汽车租赁系统42876系统+程序+源码+lw+远程部署
    基于nodejs+vue云旅青城系统
    Docker进阶:深入了解容器数据卷
    基于Matlab实现多个图像压缩案例(附上源码+数据集)
  • 原文地址:https://blog.csdn.net/lmy_520/article/details/132849699