今天遇到一个问题,见上图,控件是自己写的,不是标准的控件 在执行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 ]