【窗体】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;

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

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);
    }
}

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

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

二、显示本地图片

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

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

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

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

using System;
using System.Drawing;
using System.Windows.Forms;

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

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);
    }
}

在上述示例中,我们使用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();
}

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

  • 示例代码如下:
private void button1_Click(object sender, EventArgs e)
{
    // 创建Form2窗体实例
    Form2 form2 = new Form2();

    // 以模态方式显示Form2窗体
    form2.ShowDialog();
}

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

四、事件机制传递值

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

4.1、订阅事件

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

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

public string SelectedValue { get; set; }

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

private void button1_Click(object sender, EventArgs e)
{
    SelectedValue = comboBox1.SelectedItem.ToString();
    this.Close();
}

在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();
}

4.2、事件机制

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

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

public delegate void ValueSelectedEventHandler(string selectedValue);
public event ValueSelectedEventHandler ValueSelected;

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

private void button1_Click(object sender, EventArgs e)
{
    string selectedValue = comboBox1.SelectedItem.ToString();
    ValueSelected?.Invoke(selectedValue);
    this.Close();
}

在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();
}

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

五、基础概念

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

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

5.1、委托(Delegate)

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

5.2、事件(Event)

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

5.3、消息(Message)

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

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

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

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

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

  • 16
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
### 回答1: 在 WinForm 中,可以通过使用委托将消息从父窗体传递到子窗体委托是一种允许我们在一个窗体中定义一个事件,并在其他窗体中响应该事件的机制。 首先,在父窗体中定义一个委托类型的事件,并创建一个触发事件的方法。例如: ``` // 父窗体中定义委托事件 public delegate void MyEventHandler(string message); public event MyEventHandler MyEvent; // 触发事件的方法 private void SendMessageToChild() { if (MyEvent != null) { MyEvent("这是来自父窗体的消息"); } } ``` 然后,在子窗体中订阅这个事件,并定义一个处理事件的方法。例如: ``` // 子窗体中订阅父窗体事件 private void SubscribeParentEvent() { ParentForm parent = (ParentForm)this.ParentForm; parent.MyEvent += new MyEventHandler(ReceiveMessageFromParent); } // 处理父窗体事件的方法 private void ReceiveMessageFromParent(string message) { // 在子窗体中处理传递过来的消息 Console.WriteLine(message); } ``` 最后,在父窗体中创建子窗体的实例并显示。在需要传递消息的时候,调用父窗体的触发事件方法。例如: ``` // 创建并显示子窗体 ChildForm child = new ChildForm(); child.SubscribeParentEvent(); child.Show(); // 在需要传递消息的时候调用父窗体的方法 ParentForm parent = new ParentForm(); parent.SendMessageToChild(); ``` 通过上述步骤,我们就可以在父窗体与子窗体之间通过委托实现消息的传递。优点是可以实现窗体之间的松耦合,子窗体可以通过委托监听父窗体中的事件并作出相应处理。 ### 回答2: 要实现winform委托窗体传递到子窗体的功能,可以按照以下步骤进行操作: 1. 在父窗体中定义一个委托类型和事件,用于传递需要在子窗体中执行的方法。例如: ``` public delegate void MyDelegate(string message); public event MyDelegate SendMessageEvent; ``` 2. 在父窗体需要的时候,触发这个事件并传递相应的参数。例如: ``` SendMessageEvent?.Invoke("Hello, 子窗体!"); ``` 3. 在子窗体中定义一个接收委托类型的方法,并在需要的时候注册这个方法到父窗体事件中。例如: ``` public void ReceiveMessage(string message) { MessageBox.Show(message); } // 在子窗体加载时注册接收方法到父窗体事件中 private void ChildForm_Load(object sender, EventArgs e) { ParentForm parent = (ParentForm)this.Owner; parent.SendMessageEvent += ReceiveMessage; } ``` 通过以上操作,就可以实现在父窗体中定义委托,并在子窗体中接收并执行相应的方法。当父窗体触发事件时,子窗体中注册的方法会被调用,实现了委托的传递功能。 ### 回答3: 在WinForm中,可以通过委托将信息从父窗体传递到子窗体委托是一种特殊的数据类型,它允许将方法作为参数传递,并在需要时调用。 首先,在子窗体的类中定义一个委托,该委托代表父窗体的方法签名。例如,如果要传递一个字符串参数,可以定义一个委托如下: ```csharp public delegate void MyDelegate(string message); ``` 在父窗体中,实例化子窗体的对象,并创建一个委托的实例。然后,将父窗体的方法绑定到委托实例中。最后,将委托实例传递给子窗体的构造函数或公共属性。例如: ```csharp public partial class ParentForm : Form { private ChildForm childForm; public ParentForm() { InitializeComponent(); childForm = new ChildForm(); MyDelegate myDelegate = new MyDelegate(this.SendMessage); childForm.MyEventHandler = myDelegate; } private void SendMessage(string message) { MessageBox.Show("Received message: " + message); } } ``` 在子窗体中,定义一个公共属性来接收委托的实例,并在需要时调用该委托。例如: ```csharp public partial class ChildForm : Form { public MyDelegate MyEventHandler { get; set; } private void Button_Click(object sender, EventArgs e) { MyEventHandler?.Invoke("Hello from child form!"); } } ``` 在子窗体中的按钮点击事件中,调用委托实例的Invoke方法,并传递需要发送的信息。 这样,当子窗体中的按钮被点击时,委托会调用父窗体中定义的方法,并将消息传递给父窗体,父窗体会弹出一个消息框显示接收到的信息。 以上就是使用委托WinForm中实现父窗体向子窗体传递信息的方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

全栈小5

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

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

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

打赏作者

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

抵扣说明:

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

余额充值