网站首页 > 基础教程 正文
大家好,我是朱老师
前几天辅导学员,学员 form1调用form2时,值没有刷新,带不过去。
修改了form1的text控件里面的值,从20改到30,然后在调用显示form2时,form2的textbox控件的值还是原来的20,没有显示最新的数字30. 就是 Form1的文本框控件的30传不到form2的textbox控件里。
软件运行效果如下:
代码截图如下:
Form1调用form2
Form2 里先通过new关键字实例化form1对象frm1,然后通过调用form1的属性方法getvalue.()赋值给h变量。最后赋值给form2的文本框控件txttspririt的text属性。
结果是txtSpirit控件的text属性值还是20,没有刷新成30.造成form1的文本框的值30一直传不过去。
这个问题是初学者很常见易犯的。就是我们常说的设计模式中的单例模式问题。解决方法有很多种,下面就介绍常用比较简单的如下三种解决方法。
第一种解决方法:在form1里面定义一个静态变量static string fromTxtSpirit。然后form1在文本框输入值后,给该静态变量设置值。最后 Form2在窗体加载事件load中从静态变量fromTxtSpirit中获取,这样的话,可以保证获取到的值是 最新的值。因为静态变量是所有对象共有变量。所有实例化的窗体都可以共享该变量。
第二种解决方法:将form1窗体句柄 传给form2. Form窗体默认是只有无参的构造函数。当然form2需要增加带参数的构造函数。 具体实现方法是首先在form2中定义一个带参数的构造函数,参数类型是Form类型。 然后在form1中调用显示form2时, 通过该有参数构造方法实例化form2, 参数传值就是form1对象的实例。这样在form2类中,就可以接收到父窗体对象的实例。该实例的所有公有成员在form2对象中都可以被访问到。当然可能默认对象控件的访问范围都是私有的。这时就在需要修改下父窗体的控件的访问属性,改成public即可。
第三种解决方法:也是我们最常用的方法,定义属性方法。在form2定义个属性,实例化form2时,实时设置该属性值。这个属性不需要是静态类型。因为每次实例化的对象不一样,所以属性也会跟着对象变化。前提就是在实例化form2时,记得给属性赋值即可。代码截图如下:
当然,除了以上三种方法外,还有其他更优雅或者安全的方法机制,比如委托等等。这里就不一一举例了。
- 上一篇: 提升 C# 代码可维护性的设计模式应用
- 下一篇: C#和.Net的一些面试分享 c# 与.net
猜你喜欢
- 2024-12-28 CSnakes:在.NET项目中嵌入Python代码的工具
- 2024-12-28 巧用泛型设计模式,提升代码质量新高度
- 2024-12-28 巅峰对决!Spring Boot VS .NET 6 巅峰对决之干碎龙王短剧全集完整版第5集
- 2024-12-28 基于C#开发的物联网设备通讯协议客户端终身开源免费
- 2024-12-28 C# Flurl 库浅析(一) c#folderbrowserdialog
- 2024-12-28 C# Lazy的缺点 c#的介绍
- 2024-12-28 微服务——webapi实现,脱离iis,脱离tomcat
- 2024-12-28 231.C# 跨平台服务开发 c++跨平台开发
- 2024-12-28 C# 和 .NET 开发的 10 种基本模式
- 2024-12-28 基于C# 开发的物联网设备通讯协议客户端
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)