C# 两个或多个Form窗体之间如何传值

雪绒花痴 2020-07-21 03:19:25
如题,网上的解决办法大部分都是重新new实例一个新的窗体,这导致会多出一个新窗体,而老窗体没有发生改变,如果继续传值,窗体只会越来越多,就很烦,问一下有什么方法可以用。
...全文
1357 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
palhotel 2020-07-24
  • 打赏
  • 举报
回复
引用 25 楼 雪绒花痴 的回复:
[quote=引用 24 楼 palhotel 的回复:]感觉C#后继无人了,楼主描述问题也描述不清楚,应该说创建窗口对象,而不是new个窗口,只new 不show,怎么可能出现2个窗口呢
呵呵,是呢,你是C#的权威,是代表人物,我们这些人从一开始学就要全部知道你所说的这些理论。只new不show,笑了,你怎么知道我show没show,一个解决问题的论坛,搞到最后全是理论。[/quote] 不是,兄弟,我看你给人家回复一会儿打????,一会儿呵呵的,所以才这样说你。自己看书就行了。论坛也不能天天产生垃圾问题啊,可以搜搜老帖子。如果问垃圾问题还不谦虚点。
雪绒花痴 2020-07-24
  • 打赏
  • 举报
回复
引用 24 楼 palhotel 的回复:
感觉C#后继无人了,楼主描述问题也描述不清楚,应该说创建窗口对象,而不是new个窗口,只new 不show,怎么可能出现2个窗口呢
呵呵,是呢,你是C#的权威,是代表人物,我们这些人从一开始学就要全部知道你所说的这些理论。只new不show,笑了,你怎么知道我show没show,一个解决问题的论坛,搞到最后全是理论。
palhotel 2020-07-23
  • 打赏
  • 举报
回复
感觉C#后继无人了,楼主描述问题也描述不清楚,应该说创建窗口对象,而不是new个窗口,只new 不show,怎么可能出现2个窗口呢
  • 打赏
  • 举报
回复
我们随便举个例子,比如说你用到了 TextBox 控件,你的客户代码监听人家 TextBox 对象实例的 TextChanged 事件,以便当内容改变时及时响应。人家的 TextBox 控件是几十年前就设计了的,你的代码才刚设计几天?有无数种类的客户调用代码要依赖 TextBox,但是人家 TextBox 并不想当然地去依赖、不去纠结“传数据”给任何客户代码。

控件有千千万,而应用组件中的事件通知机制更是比控件的类型还多多几百倍。所以我说,如果不会熟练运用事件驱动机制来设计软件,你就会纠结“类型死”了的那种东西,理解不了扩展性的设计了。
hztltgg 2020-07-22
  • 打赏
  • 举报
回复
楼上说的对,如果李四不是工具人,有自己想法,数据库值变化了就想主动告诉别人,那也可以写个事件,主动通知张三
hztltgg 2020-07-22
  • 打赏
  • 举报
回复
a打开b,只是a创建b实例,他们在系统里是并列的两个实例,就像 张三生下了李四,但张三和李四法律上是平等的。 你的需求就是张三问李四“数据库是什么值?” 那李四有个方法 读取数据库的值,张三调用这个方法就可以获取了。 李四.读取数据库的值() 或者李四有个属性 数据库值, 张三访问这个属性就行。 李四.数据库值 方法的实现肯定是在李四哪儿的,但有时候李四只是个工具人,他不知道真实的数据库在哪儿的,只有张三知道,那么张三创建李四的时候,可能会把数据库的连接字符串从配置文件里取出来,作为创建的参数传递给李四。 至于有的人说的公共类,就是再引入一个王五,李四吧值告诉王五,张三问王五值是什么,多增加麻烦,没必要。
  • 打赏
  • 举报
回复
“传回”以及“两个窗体传值”这类说法,其实都是站在外行用户角度的说法,而非站在程序架构角度。程序架构要让类型之间的依赖是单向的,而不能循环依赖的。“倒置的依赖”就是事件通知机制,也就是说事件是B类定义的,由B类对象触发,由各种客户类型对象实现事件处理过程,B类作为服务不依赖于任何客户类型进行设计。并不存在循环依赖概念。
  • 打赏
  • 举报
回复
引用 15 楼 雪绒花痴 的回复:
窗体A打开窗体B,窗体B获取到数据库或者其他什么的信息值,在“传回”给窗体A,这应该不是对话框吧,就把数据返回给原本的窗体里,我是这么理解“传回”的。公共属性是要在新添加的类里写,还是在form窗体里写,公共类这些不太明白。


设计这类关系时,A依赖于B,而B不应该依赖于A,这样B才能作为服务提供给多类(多个)客户使用。那么B有什么改变,应该抛出事件通知。例如:
public event Action<MyDataType> 更新了数据XX;
或者只是
public event Action 更新了数据XX;
即可。
  • 打赏
  • 举报
回复
描述清楚窗体对象之间的依赖关系链。
雪绒花痴 2020-07-22
  • 打赏
  • 举报
回复
引用 14 楼 hztltgg 的回复:
[quote=引用 7 楼 雪绒花痴 的回复:][quote=引用 6 楼 hztltgg 的回复:]网上new实例一个新的窗体,是为了演示传值而故意建两个实例吧?不是说传值需要new。 其实传值可能压根不是你的需求,这个概念应该是以前拖控件开发带来的吧。 每个窗体有自己的公共属性,直接访问就可以得到了。或者调用一个窗体的方法,主动把参数放进去也可以。
我不知道别人怎么想的,我百度到的窗体传值方法都是new,我的想法就是这个窗体所获得到的值重新传回一开始的窗体里。还有获取别的窗体属性,直接访问?不懂,还是要new的吧[/quote] 看你的需求应该是对话框功能吧?“传回”你是怎么理解的?既然这个窗体已经获得值了,把这个值放到公共属性里,一开始的窗体直接访问不就可以了? 比如 var value = 新窗体实例.需要值的公共属性; [/quote] 窗体A打开窗体B,窗体B获取到数据库或者其他什么的信息值,在“传回”给窗体A,这应该不是对话框吧,就把数据返回给原本的窗体里,我是这么理解“传回”的。公共属性是要在新添加的类里写,还是在form窗体里写,公共类这些不太明白。
hztltgg 2020-07-22
  • 打赏
  • 举报
回复
引用 7 楼 雪绒花痴 的回复:
[quote=引用 6 楼 hztltgg 的回复:]网上new实例一个新的窗体,是为了演示传值而故意建两个实例吧?不是说传值需要new。 其实传值可能压根不是你的需求,这个概念应该是以前拖控件开发带来的吧。 每个窗体有自己的公共属性,直接访问就可以得到了。或者调用一个窗体的方法,主动把参数放进去也可以。
我不知道别人怎么想的,我百度到的窗体传值方法都是new,我的想法就是这个窗体所获得到的值重新传回一开始的窗体里。还有获取别的窗体属性,直接访问?不懂,还是要new的吧[/quote] 看你的需求应该是对话框功能吧?“传回”你是怎么理解的?既然这个窗体已经获得值了,把这个值放到公共属性里,一开始的窗体直接访问不就可以了? 比如 var value = 新窗体实例.需要值的公共属性;
IT_study001 2020-07-22
  • 打赏
  • 举报
回复
两个的话,用NEW的话没什么问题, 但是多个的话还是公共类比较简单 其实不管怎么样。用个公共类,简直一劳永逸~
  • 打赏
  • 举报
回复
“事件驱动开发”是一个基本的设计模式,它应该是任何职业程序师的基本知识。所以一定要注意到,如果不能充分理解和运用事件驱动设计,那么必定,至少有一半的程序设计知识和经验还根本还没有学过、见过。
  • 打赏
  • 举报
回复
比如说,有一个数据采集窗口,它可以显示采集器的状态(例如采集总数)。那么要监听它的事件通知的窗口有不只一个,都是它的客户。

所以不是什么“B传给A”的设计概念,也不是什么“一个静态变量”的概念。因为 B 是服务,它根本不去访问任何客户对象,它只是把事件触发一下就行了,所有的监听事件客户会依次收到消息。
Monkey_416 2020-07-21
  • 打赏
  • 举报
回复
1.委托方式比较常见; 2.公共类相对比较简单; 3.当然你也可以采用TCP通讯,或者RPC远程调用; 4.另外还有消息队列这些;
正怒月神 2020-07-21
  • 打赏
  • 举报
回复
2个通用方案 1 公共类,静态类/静态字段 2 委托 下面演示的是委托 https://blog.csdn.net/hanjun0612/article/details/50071539
雪绒花痴 2020-07-21
  • 打赏
  • 举报
回复
引用 8 楼 icoolno1 的回复:
不就是两个object之间的传值,你调我的公开成员,我调你的公开成员。
呵呵,不就是
threenewbee 2020-07-21
  • 打赏
  • 举报
回复
https://bbs.csdn.net/topics/360140208
鸡窝里的毛 2020-07-21
  • 打赏
  • 举报
回复
不就是两个object之间的传值,你调我的公开成员,我调你的公开成员。
雪绒花痴 2020-07-21
  • 打赏
  • 举报
回复
引用 6 楼 hztltgg 的回复:
网上new实例一个新的窗体,是为了演示传值而故意建两个实例吧?不是说传值需要new。 其实传值可能压根不是你的需求,这个概念应该是以前拖控件开发带来的吧。 每个窗体有自己的公共属性,直接访问就可以得到了。或者调用一个窗体的方法,主动把参数放进去也可以。
我不知道别人怎么想的,我百度到的窗体传值方法都是new,我的想法就是这个窗体所获得到的值重新传回一开始的窗体里。还有获取别的窗体属性,直接访问?不懂,还是要new的吧
加载更多回复(5)
串联谐振双有源桥(SR-DAB)DC-DC变换器闭环仿真研究内容概要:本文围绕串联谐振双有源桥(SR-DAB)DC-DC变换器的闭环仿真展开研究,重点探讨其在电力电子系统中的动态响应特性与控制策略。通过对SR-DAB变换器建立数学模型,并结合Matlab/Simulink进行闭环仿真,分析系统在不同工作条件下的电压、电流波形及功率传输效率,验证控制算法的有效性与稳定性。研究涵盖系统建模、控制器设计(如PI控制)、软开关实现条件、抗干扰能力以及动态调节性能,旨在提升变换器在新能源、储能、数据中心供电等场景中的可靠性和能效水平。; 适合人群:具备电力电子、自动控制理论基础,从事新能源、微电网、电力系统仿真等相关领域的科研人员与工程技术人员。; 使用场景及目标:①用于高校及科研机构开展DC-DC变换器控制策略的教学与实验;②为工业界在高效率隔离型功率变换系统的设计与优化提供仿真依据和技术支撑;③服务于数据中心、电动汽车、可再生能源并网等场景下的电源系统研发。; 阅读建议:建议读者结合Matlab代码实践仿真流程,重点关注系统建模与控制器参数整定部分,通过调整负载、输入电压等条件观察系统响应,深入理解闭环控制对变换器性能的影响机制。
内容概要:本文介绍了FastReport VCL/FMX/LCL 2026.2.4版本的更新内容,重点涵盖核心引擎、图形处理、用户界面及导出功能的优化与修复。主要更新包括修复了Developer Express兼容性问题、TfrxSVGGraphic在TImage中的显示问题、PDF/A导出合规性、EMF图像旋转异常,以及ReportTree拖拽功能等问题。同时,部分模块新增了HTMLTags对XLSX导出的支持、内置右键菜单和新图标,并改进了FastCube组件的元素调整体验。此外,还修复了CPP脚本中Result参数名的Bug以及自定义过滤器中OR操作失效的问题。; 适合人群:使用Delphi或Lazarus进行开发,且涉及报表设计与数据展示功能的中高级开发者;尤其适用于需要集成FastReport控件到企业级应用中的技术人员。; 使用场景及目标:①提升报表系统在不同平台(VCL/FMX/LCL)下的稳定性和兼容性;②满足PDF/A标准的文档归档需求;③优化用户交互体验,如拖拽操作与元素缩放;④增强脚本支持与数据集字段识别能力,确保开发效率与功能完整性。; 阅读建议:建议结合官方更新链接和实际项目中使用的FastReport模块对照查看,重点关注自身所用组件(如VCL、FMX或Lazarus版)的具体修复项,及时升级以规避已知问题并利用新特性优化报表功能。

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧