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

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

目录

  • 一、显示线上图片
  • 二、显示本地图片
  • 三、A窗体打开B窗体
  • 四、事件机制传递值
    • 4.1、订阅事件
    • 4.2、事件机制
  • 五、基础概念
    • 5.1、委托(Delegate)
    • 5.2、事件(Event)
    • 5.3、消息(Message)
    • 5.4、发布(Publish)和订阅(Subscribe)

在这里插入图片描述

一、显示线上图片

要在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);// 创建并分配图片给PictureBoxImage 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);// 将图片分配给PictureBoxpictureBox1.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# 中,通常通过定义委托和事件来实现发布-订阅模式,发布者发布事件,而订阅者订阅并处理事件。
事件是一种特殊类型的委托,它可以提供更高级别的封装和安全性。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/107742.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea创建一个微服务项目

idea创建一个微服务项目 前提:懂得创建基于pom 的 springboot项目 1.像平时创建Maven项目一样创建一个项目 2.删掉src文件,只剩下下面的东西 3.基于这个项目创建model,model也是一个Maven项目,基于springboot mvc 都行&#xff…

工作中有许多比较常用的SQL脚本

工作中有许多比较常用的SQL脚本,今天开始分几章分享给大家。 1、行转列的用法PIVOTCREATE table test (id int,name nvarchar(20),quarter int,number int) insert into test values(1,N苹果,1,1000) insert into test values(1,N苹果,2,2000) insert into test va…

01-Kafaka

1、Kafka 2 的安装与配置 1、上传kafka_2.12-1.0.2.tgz到服务器并解压: tar -zxf kafka_2.12-1.0.2.tgz -C /opt 2、配置环境变量并更新: 编辑profile配置文件: vim /etc/profile #设置kafka的环境变量export KAFKA_HOME/opt/kafka_2.1…

Redis——渐进式遍历和数据库管理命令

介绍 如果使用keys * 这样的操作,将Redis中所有的key都获取到,由于Redis是单线程工作,这个操作本身又要消耗很多时间,那么就会导致Redis服务器阻塞,后续的操作无法正常执行 而渐进式遍历,通过多次执行遍历…

Python灰帽编程——初识Python上

1. Python 简介 常用安全工具语言示例perljoomscan whatwebrubymetasploit-frameworkpythonsqlmap pocsuite3gogoby 1.1 Python 起源 1.1.1 语言的作者 贵铎范罗萨姆(Guido van Rossum)荷兰人于1989 年圣诞节始创了python。 大神就是大神&#xff0…

MyBatis中当实体类中的属性名和表中的字段名不一样,怎么办

方法1: 在mybatis核心配置文件中指定,springboot加载mybatis核心配置文件 springboot项目的一个特点就是0配置,本来就省掉了mybatis的核心配置文件,现在又加回去算什么事,总之这种方式可行但没人这样用 具体操作&…

[每周一更]-(第62期):SRE 是什么?

在公司Devops平台搭建,采用了JenkinsGitGitlabDocker,进行了自动化构建和部署代码,解放了繁杂的代码更改到test/prod环境的问题; 这部分更多是运维比例极大,少量的开发操作,基本都是配置命令行以及yml配置、…

JDK20 + SpringBoot 3.1.0 + JdbcTemplate 使用

JDK20 SpringBoot 3.1.0 JdbcTemplate 使用 一.测试数据库 Postgres二.SpringBoot项目1.Pom 依赖2.配置文件3.启动类4.数据源配置类5.实体对象类包装类6.测试用实体对象1.基类2.扩展类 7.测试类 通过 JdbcTemplate 直接执行 SQL 语句,结合源码动态编译即可方便实现…

模型解释方法

模型生成后需要对模型进行解释 特征权重 importances rfc.feature_importances_ indices np.argsort(importances)[::-1] #[::-1]表示将各指标按权重大小进行排序输出 for f in range(data_train_x[:100].shape[1]):print("%2d) %-*s %f" % (f 1, 30, data_trai…

算法训练营day46|动态规划 part08:完全背包 (LeetCode 139. 单词拆分、多重背包理论基础)

文章目录 139. 单词拆分 (求排列方法)回溯思路分析背包思路分析代码实现思考总结 多重背包理论基础 139. 单词拆分 (求排列方法) 题目链接🔥🔥 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多…

docker 方式安装mysql 主从方式keepalived实现高可用

一、环境介绍 二、MySQL安装 在两台服务器上都安装mysql 1、拉取镜像 docker pull mysql:8.0.272、创建挂载目录 mkdir -p /data/mysql/3、运行容器 主节点 docker run \--restartalways \--name master_mysql -p 3306:3306 \-e MYSQL_ROOT_PASSWORD123456 -d \-v /data/m…

用户权限数据转换为用户组列表(3/3) - Excel PY公式

最近Excel圈里的大事情就是微软把PY塞进了Excel单元格,可以作为公式使用,轻松用PY做数据分析。系好安全带,老司机带你玩一把。 实例需求:如下是AD用户的列表,每个用户拥有该应用程序的只读或读写权限,现在需要创建新的…