【窗体】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
类的实例来创建一个新的窗体,并调用其Show
或ShowDialog
方法来显示它。
- 下面是一个简单的示例代码:
假设你已经创建了两个窗体:Form1
和Form2
。
在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 安装 之前写了࿰…...
VRTK4⭐四.和 UI 元素交互
文章目录 🟥 安装Tilia Unity.UI🟧 配置射线与UI交互器1️⃣ 配置直线射线2️⃣ 配置UI交互器 🟨 配置UI1️⃣ 更新EventSystem2️⃣ 进行Canvas设置 我们要实现的功能: 右手触摸到圆盘:显示直线射线 右手圆盘键按下:与选中UI交互 Ƿ…...
【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. 控制台(…...
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…...
Linux下,基于TCP与UDP协议,不同进程下单线程通信服务器
C语言实现Linux下,基于TCP与UDP协议,不同进程下单线程通信服务器 一、TCP单线程通信服务器 先运行server端,再运行client端输入"exit" 是退出 1.1 server_TCP.c **#include <my_head.h>#define PORT 6666 #define IP &qu…...
qt功能自己创作
按钮按下三秒禁用 void MainWindow::on_pushButton_5_clicked(){// 锁定界面setWidgetsEnabled(ui->centralwidget, false);// 创建一个定时器,等待3秒后解锁界面QTimer::singleShot(3000, this, []() {setWidgetsEnabled(ui->centralwidget, true);;//ui-&g…...
Linux网络编程:使用UDP和TCP协议实现网络通信
目录 一. 端口号的概念 二. 对于UDP和TCP协议的认识 三. 网络字节序 3.1 字节序的概念 3.2 网络通信中的字节序 3.3 本地地址格式和网络地址格式 四. socket编程的常用函数 4.1 sockaddr结构体 4.2 socket编程常见函数的功能和使用方法 五. UDP协议实现网络通信 5.…...
【后端速成 Vue】初识指令(上)
前言: Vue 会根据不同的指令,针对标签实现不同的功能。 在 Vue 中,指定就是带有 v- 前缀 的特殊 标签属性,比如: <div v-htmlstr> </div> 这里问题就来了,既然 Vue 会更具不同的指令&#…...
爬虫 — Scrapy-Redis
目录 一、背景1、数据库的发展历史2、NoSQL 和 SQL 数据库的比较 二、Redis1、特性2、作用3、应用场景4、用法5、安装及启动6、Redis 数据库简单使用7、Redis 常用五大数据类型7.1 Redis-String7.2 Redis-List (单值多value)7.3 Redis-Hash7.4 Redis-Set (不重复的)7.5 Redis-Z…...
tcpdump常用命令
需要安装 tcpdump wireshark ifconfig找到网卡名称 eth0, ens192... tcpdump需要root权限 网卡eth0 经过221.231.92.240:80的流量写入到http.cap tcpdump -i eth0 host 221.231.92.240 and port 80 -vvv -w http.cap ssh登录到主机查看排除ssh 22端口的报文 tcpdump -i …...
计算机网络运输层网络层补充
1 CDMA是码分多路复用技术 和CMSA不是一个东西 UPD是只确保发送 但是接收端收到之后(使用检验和校验 除了检验的部分相加 对比检验和是否相等。如果不相同就丢弃。 复用和分用是发生在上层和下层的问题。通过比如时分多路复用 频分多路复用等。TCP IP 应用层的IO多路复用。网…...
java CAS详解(深入源码剖析)
CAS是什么 CAS是compare and swap的缩写,即我们所说的比较交换。该操作的作用就是保证数据一致性、操作原子性。 cas是一种基于锁的操作,而且是乐观锁。在java中锁分为乐观锁和悲观锁。悲观锁是将资源锁住,等之前获得锁的线程释放锁之后&am…...
1786_MTALAB代码生成把通用函数生成独立文件
全部学习汇总: GitHub - GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes…...
2023/09/19 qt day3
头文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QDebug> #include <QTime> #include <QTimer> #include <QPushButton> #include <QTextEdit> #include <QLineEdit> #include <QLabel> #include &l…...
东莞南城网站开发公司/网站查询系统
上篇文章(Simditor使用方法)只是简单的默认配置,我们可自定义工具栏按钮使其更丰富和实现上传图片功能初始化编辑器$(function(){toolbar [ title, bold, italic, underline, strikethrough,color, |, ol, ul, blockquote, code, table, |,link, image, hr, |, indent, outden…...
在唐山做网站多少钱/郑州网站优化公司
1、查看 /opt 整个目录大小 [rootlocalhost xml_onvif]# df -h /opt Filesystem Size Used Avail Use% Mounted on /dev/sda2 18G 12G 5.3G 69% / 2、查看 /opt 目录下的文件大小 [rootlocalhost xml_onvif]# ls -lh /opt/ total 442M drwxr-xr…...
向国旗敬礼做时代新人网站/国际新闻界期刊
//C#访问SQL Server数据库,SqlConnection用于建立与数据库的连接//SqlCommand用于创建SQL命令//SqlDataReader对象是执行SqlCommand对象返回结果集的查询语句后的结果 //用于连接的字符串string connectString "data SourceGUCAS-A4ACB77A6\\SQLEXP…...
响应式网站用什么语言/如何制作网页链接教程
1.原型链继承。通过构建构造函数,在构造函数的原型链上添加属性和方法扩展其功能。通过new 构造函数实例化,实现继承。通过上面的代码可以看到,我们无法为不同示例赋值不同的name,所有的实例对象只能共享一个name。2.借用构造函数…...
保定做网站的公司/分销系统
2019独角兽企业重金招聘Python工程师标准>>> 是这样的,我的项目的框架是 之前 公司统一使用的框架,配置都配置好了的。 大神们说是没有问题的, 我简单过了一下,也没有问题。 在项目上线并完成了好久后。。。就在前几天…...
wordpress5.0.2/友联互换
ONVIF开发经验总结 ONVIF开发经验总结....................................................................................................... 1 一、 利用gsoap2.8.14生成Onvif相关源代码................................................................ 2 1. 生…...