今天遇到一个问题,见上图,控件是自己写的,不是标准的控件 在执行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()这个方法是有意义的。

今天遇到一个问题,见上图,控件是自己写的,不是标准的控件 在执行Controls.Add(control),出现上述问题。问题的具体描述:根据条件设置移除和加入不同的控件,当前控件不满足条件时,将控件移除,然后加入新的控件。代码如下: if (this.Panel.Controls.Contains(this.R_Parameter)) { this.Panel.Controls.Remove(this.R_Para...
出现bug的原因是我点击Main form中一个按钮,弹出一个form 窗口 A,然后A关闭的 候,返回Main。然后发现操作的次数多了就会出现上述bug,刚开始以为是 创建 句柄 出错 ,写了下面一段代码: /*窗体在InitializeComponent()的 候如果 创建 不成功,尝试在Form的子类中重写CreateHandle,如果 创建 不成功,通过RecreateHandle,一般都会成...
这个问题的出现是因为内存溢出产生的,由于一直在 创建 控件却得不到释放出现内存溢出。那我们就找方法释放控件。正确的释放控件的方法是            while (tabControl.Controls.Count > 0)                 if (tabControl.Controls[0] != null)
Winform 窗体 win32Exception:“ 创建 窗口 句柄 出错 ” 类似如上图中的win32 创建 窗口 句柄 出错 ,根据实际解决问题的推测,是我们的GC自动回收机制出现了问题,有些是第三方控件本身的具有的问题,有些是控件的生成多次重复使用导致的。 一般解决方案,为在抛出异常的第三方控件或 winform 自身控件或者自定义控件使用完毕后,手动调用控件的Dispose()方法,主动释放即可。 关于释放...
委托调用form的show ,未 创建 窗口 句柄 前不能调用beginInvoke 在工作中遇到一个场景,运行一个form程序,但是有个form1从来没有show过,只是实例化了; form程序中托管了一个webapi,webapi接收到请求 ,要show form1; var config = new HttpSelfHostConfiguration("http://localhost:8081"); config.Routes.MapHttpRoute( name: "API Default",
回答: 在 Winform 中,实现多 窗口 页面可以通过 创建 多个窗体对象来实现。可以使用foreach循环遍历已经打开的窗体,判断窗体类型是否与要打开的窗体类型相同,如果相同则激活该窗体,否则 创建 新的窗体对象并显示出来。\[1\]在按钮点击事件中,可以通过 创建 窗口 对象并订阅子 窗口 的事件来实现 窗口 间的通信。\[2\]在窗体切换过程中,可能会出现 创建 窗口 句柄 出错 的问题,可以通过在窗体关闭 执行FormClosed方法或FormClosing方法来销毁窗体对象,避免对象一直增加而没有销毁的情况发生。\[3\] #### 引用[.reference_title] - *1* *3* [ winform 创建 窗口 句柄 出错 ](https://blog.csdn.net/kexianjun66/article/details/109183781)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ WinForm 窗口 向父 窗口 回传信息](https://blog.csdn.net/jhycjhyc/article/details/102562829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]