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

雪绒花痴 2020-07-21 03:19:25
如题,网上的解决办法大部分都是重新new实例一个新的窗体,这导致会多出一个新窗体,而老窗体没有发生改变,如果继续传值,窗体只会越来越多,就很烦,问一下有什么方法可以用。
...全文
1318 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)

111,093

社区成员

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

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

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