WinForm 创建窗口句柄时出错

简介: WinForm 创建窗口句柄时出错

tt.png

今天遇到一个问题,见上图,控件是自己写的,不是标准的控件 在执行Controls.Add(control),出现上述问题。


问题的具体描述:根据条件设置移除和加入不同的控件,当前控件不满足条件时,将控件移除,然后加入新的控件。


代码如下:


  if (this.Panel.Controls.Contains(this.R_Parameter))

               {

                   this.Panel.Controls.Remove(this.R_Parameter);

                   R_Parameter.Dispose();

               }

               this.RMC_Parameter = new MODE_CONFIG();

 this.Panel.Controls.Add(R_Parameter);


有人提出解决问题的思路是重写报错控件的CreateHandle()方法,代码如下:


  protected override void CreateHandle()

       {

           if (!IsHandleCreated)

           {

               try

               {

                   base.CreateHandle();

               }

               catch { }

               finally

               {

                   if (!IsHandleCreated)

                   {

                       base.RecreateHandle();

                   }

               }

           }

       }


经过测试有所好转,反复测试几次后,问题又出现了。事实证明有所好转,但是没有解决根本的原因。


后来再查找资料的时候,有人提出,导致这问题出现的原因是被移除的控件没有释放。于是增加Dispose()方法,代码如下:


  if (this.Panel.Controls.Contains(this.R_Parameter))

               {

                   this.Panel.Controls.Remove(this.R_Parameter);

                   R_Parameter.Dispose();

               }

               this.RMC_Parameter = new MODE_CONFIG();

 this.Panel.Controls.Add(R_Parameter);


再次测试,发现问题解决了,反复几次都没有出现。


然后注释掉CreateHandle()方法,再测试发现问题又出现了,所以重写CreateHandle()这个方法是有意义的。


 


目录
相关文章
|
前端开发 JavaScript API
Layui的CRUD(增删改查)
Layui的CRUD(增删改查)
337 0
|
域名解析 关系型数据库 MySQL
怎样用自己电脑搭建网络服务器!不花一分钱
怎样用自己电脑搭建网络服务器!不花一分钱
1323 1
|
11月前
|
XML JSON API
手把手教你调用京东商品详情 API:从申请到数据抓取全流程
京东商品详情API为电商从业者、分析师及开发者提供高效数据支持,助力优化业务与研究。该接口具备丰富数据(商品属性、价格、描述、图片、评价等)与灵活请求方式(GET/POST),满足多样化需求,是数字化时代电商应用开发与分析的有力工具。
618 13
|
关系型数据库 MySQL 容器
docker-compose安装mysql并指定忽略表名大小写以及挂载配置文件
docker-compose安装mysql并指定忽略表名大小写以及挂载配置文件
1213 0
docker-compose安装mysql并指定忽略表名大小写以及挂载配置文件
|
Android开发 C++
so兼容32位和64位
在Android开发中遇到32位`xxx.so`动态库在64位设备上运行失败的问题,导致应用崩溃。错误提示因缺少64位版本的库。尝试创建`arm64-v8a`目录并复制库文件后,依然崩溃,因为库本身是32位。解决方案是在`build.gradle`中添加配置,指定支持的ABI滤镜,并在`gradle.properties`中设置`android.useDeprecatedNdk=true`,以解决兼容性问题。
821 7
|
开发框架 缓存 前端开发
基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理
基于SqlSugar的开发框架循序渐进介绍(4)-- 在数据访问基类中对GUID主键进行自动赋值处理
|
开发框架 缓存 NoSQL
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
基于SqlSugar的数据库访问处理的封装,在.net6框架的Web API上开发应用
|
人工智能 IDE Devops
通义灵码技术解析,打造 AI 原生开发新范式
本文第一部分先介绍 AIGC 对软件研发的根本性影响,从宏观上介绍当下的趋势;第二部分将介绍 Copilot 模式,第三部分是未来软件研发 Agent 产品的进展。
74365 7
|
设计模式 JavaScript 安全
【TypeScript 技术专栏】TypeScript 性能优化与代码质量提升
【4月更文挑战第30天】探索 TypeScript 性能优化与代码质量提升:合理使用类型注解,减少不必要的类型断言,优化模块导入,避免过度封装;遵循编码规范,加强注释,运用设计模式,进行代码审查。在追求性能与质量间找平衡,通过案例分析实践优化策略,持续提升项目体验与可持续发展。一起打造优质 TypeScript 项目!
506 0
|
网络协议 物联网 数据安全/隐私保护
CC2530+ESP8266与手机APP通信
通过CC2530控制ESP8266将其配置成AP+TCP服务器模式,并通过手机APP连接到TCP服务器并完成数据传输。ESP8266将作为一个热点(AP)来工作,其WiFi模块被配置为建立一个TCP服务器并监听端口号。CC2530将使用其串口与ESP8266进行通信,并通过AT指令控制ESP8266的WiFi模块设置和数据传输。
1409 0

热门文章

最新文章