当前位置: 首页 > news >正文

【窗体】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# 中,通常通过定义委托和事件来实现发布-订阅模式,发布者发布事件,而订阅者订阅并处理事件。
事件是一种特殊类型的委托,它可以提供更高级别的封装和安全性。

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

相关文章:

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

2023年,第38周。给自己一个目标,然后坚持总会有收货,不信你试试! 在实际项目中,我们可能会用到一些窗体做一些小工具或者小功能。比如:运行程序,在主窗体A基础上,点击某个按钮希望能…...

mac使用指南

新公司给配备了mac,可惜土鳖的我不会用,所以特地写了一篇文章记录学习mac的过程 快捷键 删除:commanddelete 光标移至最右/左:command右/左箭头 截图:commandshift3/4/5,3代表截全屏,4代表选…...

Git 版本控制系统 笔记

概念:一个免费开源,分布式的代码版本控制系统,帮助开发团队维护代码 作用:记录代码内容,切换代码版本,多人开发时高效合并代码内容【团队开发同一个项目的代码版本管理】 1、Git 安装 之前写了&#xff0…...

VRTK4⭐四.和 UI 元素交互

文章目录 🟥 安装Tilia Unity.UI🟧 配置射线与UI交互器1️⃣ 配置直线射线2️⃣ 配置UI交互器 🟨 配置UI1️⃣ 更新EventSystem2️⃣ 进行Canvas设置 我们要实现的功能: 右手触摸到圆盘:显示直线射线 右手圆盘键按下:与选中UI交互 &#x1f7…...

【STM32】SDIO—SD 卡读写01

基于stm32f103 基于零死角玩转STM32—F103指南者 简介 1.SD 卡总共有 8 个寄存器,用于设定或表示 SD 卡信息。 2.SD卡的寄存器不能像STM32那样访问,而是利用命令访问,SDIO 定义了 64 个命令。SD 卡接收到命令后,根据命令要求对…...

SpringCloud Alibaba 整合Sentinel的基本使用

文章目录 一、什么是Sentinel二、Sentinel 的主要特性1. 流量控制:2. 熔断降级:3. 实时监控:4. 规则配置:5. 集成方便: 三、Sentinel 分为哪几部分:1. 核心库(Java 客户端)2. 控制台&#xff08…...

Linux中如何执行命令

目录 命令格式: 命令分类: 命令帮助: 1、man 2、help 3、--help 4、info命令 终止命令: 补全命令: 1)补全命令: 2)补全文件名和目录名: 命令格式:…...

基于51单片机的智能病房呼叫系统的设计与实现

一、前言 显示床位号使用到4位数码管,为了节约单片IO口,使用TM1637来驱动数码管。 二、TM1637驱动芯片简介 三、电路设计,使用矩阵按键来模拟每个床位的呼叫按钮 四、编写51单片机代码 void delay_ms(u16 n) {u8 i;while(n--){i 111;while…...

js在一个时间范围内产生一个随机时间

js使用使用到Math.random()方法实现在一个时间范围内产生一个随机时间。 /*在时间范围内产生一个随机时间*/ function randomDate(start, end) {if (start ! null && end ! null) {const _start new Date(start).getTime();const _end new Date(end).getTime();cons…...

Javascript Date 对象相关知识

Javascript Date 对象相关知识 参考文章虹猫1992 创建 Date 对象. 方法一: 自动使用当前的日期和时间作为其初始值. var date new Date();方法二:将给定的毫秒数转换为使用的时间,new Date(dateVal) 如果是数字值,dateVal表示指定日期与1970年1月1日午…...

Vim快捷用法

以下为文本操作 1.快速切换 行首^(shift4) 行尾$(shift6) 文章开始gg 位置末尾G 向下翻页CTRLB 向上翻页CTRLF 2.删除内容 删除一行 dd 3.复制粘贴 复制一行yy 粘贴 p 4.撤销操作 撤销操作 u 恢复操作ctrlr 以下都为底行操作 1.显示行号 set nu 2.多文件分屏阅读 加入阅…...

Stream流的常用方法(自用)

自用的笔记, 有🚩 需要多看 基本数据 自定义实体 Data class Student{private String name;private Integer age;private Double height;public Student() {} }假数据 Student s1 new Student(); s1.setAge(20); s1.setName("cookie"); s1.setHeight(…...

【python函数】torch.nn.Embedding函数用法图解

学习SAM模型的时候,第一次看见了nn.Embedding函数,以前接触CV比较多,很少学习词嵌入方面的,找了一些资料一开始也不是很理解,多看了两遍后,突然顿悟,特此记录。 SAM中PromptEncoder中运用nn.Emb…...

with ldid... /opt/MonkeyDev/bin/md: line 326: ldid: command not found

吐槽傻逼xcode 根据提示 执行了这个脚本/opt/MonkeyDev/bin/md 往这里面添加你brew install 安装文件的目录即可...

[golang gui]fyne框架代码示例

1、下载GO Go语言中文网 golang安装包 - 阿里镜像站(镜像站使用方法:查找最新非rc版本的golang安装包) golang安装包 - 中科大镜像站 go二进制文件下载 - 南京大学开源镜像站 Go语言官网(Google中国) Go语言官网(Go团队) 截至目前(2023年9月17日&#x…...

2000-2018年各省能源消费和碳排放数据

2000-2018年各省能源消费和碳排放数据 1、时间:2000-2018年 2、范围:30个省市 3、指标:id、year、ENERGY、COAL、碳排放倒数*100 4、来源:能源年鉴 5、指标解释: 2018年碳排放和能源数据为插值法推算得到 碳排放…...

C# ref 学习1

ref 关键字用在四种不同的上下文中; 1.在方法签名和方法调用中,按引用将参数传递给方法。 2.在方法签名中,按引用将值返回给调用方。 3.在成员正文中,指示引用返回值是否作为调用方欲修改的引用被存储在本地,或在一般…...

MQ - 08 基础篇_消费者客户端SDK设计(下)

文章目录 导图Pre概述消费分组协调者消费分区分配策略轮询粘性自定义消费确认确认后删除数据确认后保存消费进度数据消费失败处理从服务端拉取数据失败本地业务数据处理失败提交位点信息失败总结导图 Pre...

Flutter层对于Android 13存储权限的适配问题

感觉很久没有写博客了,不对,的确是很久没有写博客了。原因我不怎么想说,玩物丧志了。后面渐渐要恢复之前的写作节奏。今天来聊聊我最近遇到的一个问题: Android 13版本对于storage权限的控制问题。 我们都知道,Andro…...

Android kotlin开源项目-功能标题目录

目录 一、BRVAH二、开源项目1、RV列表动效(标题目录)2、拖拽与侧滑(标题目录)3、数据库(标题目录)4、树形图(多级菜单)(标题目录)5、轮播图与头条(标题目录)6…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色&#xf…...

【2025年】解决Burpsuite抓不到https包的问题

环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

push [特殊字符] present

push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...

腾讯云V3签名

想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...