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()这个方法是有意义的。


 


目录
相关文章
|
2月前
MFC窗口创建机制
MFC窗口创建机制
10 0
|
API C# Windows
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
本篇主要介绍一些与窗口句柄相关的一些API,比如设置窗口状态、当前激活的窗口、窗口客户区的大小、鼠标位置、禁用控件等,以及介绍Winform中的句柄属性,便于直接获取控件或窗体句柄,以及不推荐...
1714 0
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
|
API C# Windows
C#实现操作Windows窗口句柄:遍历、查找窗体和控件【窗口句柄最全总结之一】
C#对Windows窗口或窗口句柄的操作,都是通过 P/Invoke Win32 API 实现的,DllImport引入Windows API操作窗口(句柄),可以实现枚举已打开的窗口、向窗口...
2072 0
C#实现操作Windows窗口句柄:遍历、查找窗体和控件【窗口句柄最全总结之一】
|
C# C++
获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄
原文:获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄 有时候在c++调用wpf控件的时候,wpf控件想自己显示窗体,但需要设置owner属性。迂回解决办法是设置wpf的window窗体的父窗体为进程的句柄。
3059 0
|
Web App开发 C#
C#WinForm程序不不在任务栏显示的处理方法
窗体不在任务栏上显示程序的窗体,c# Form提供了一个 属性值可以很好的解决这个问题 这个属性就是 ShowInTaskbar 在微软的官方声明格式为:  public bool ShowInTaskbar {  get; set; } 及可以通过这个属性来获取或设置一个值 这个属性值的默认值是true 就是要在任务栏上显示窗体,如果我们想不显示就直接在load事件中加上如下
1663 0