C#动态创建控件导致“创建窗口句柄时出错”
窗口界面上有一个picturebox控件,该控件显示的是一些平面图,大概每隔10秒会让该picturebox控件加载不同的平面图,然后从数据库里读取要在该平面图上显示的一些记录,根据记录在这个picturebox上动态创建一些小的picturebox控件作为监控点,代码如下://把平面图上已经显示的监控点图标清空
foreach (Control cl in ptbMap.Controls)
{
ptbMap.Controls.Remove(cl);
cl.Dispose();
}
ptbMap.Controls.Clear();
//初始化平面图显示区域的资源
if (ptbMap.Image != null)
{
ptbMap.Image.Dispose();
ptbMap.Image = null;
}
ptbMap.Image = OperTextResource.LoadLocalImage(Application.StartupPath, mapFile);
PictureBox ptbEqu = new PictureBox();
ptbEqu.BackColor = System.Drawing.Color.Transparent;
ptbEqu.Cursor = Cursors.Arrow;
ptbEqu.SizeMode = PictureBoxSizeMode.AutoSize;
ptbEqu.Tag = hexRecordValuesSplit1[0];
ptbEqu.Name = "ptbEqu" + hexRecordValuesSplit1[0];
ptbMap.Controls.Add(ptbEqu);
ptbEqu.Location = ptbCur;
ptbEqu.ContextMenuStrip = cMenu;
ptbEqu.Visible = true;
//注册监控图标的事件
ptbEqu.MouseEnter += new System.EventHandler(PtbEqu_MouseEnter);
ptbEqu.MouseDown += new System.Windows.Forms.MouseEventHandler(PtbEqu_MouseDown);
结果在运行了两天后,出现“创建窗口句柄时出错”,出错的语句是在ptbMap.Controls.Add(ptbEqu)这里,内存也不断增加,请问各位高手,怎么解决资源回收问题。 --------------------编程问答-------------------- 没时间仔细研究,但我认为你可以在释放资源前把事件委托松绑,类似:
ptbEqu.MouseEnter -= new System.EventHandler(PtbEqu_MouseEnter);
ptbEqu.MouseDown -= new System.Windows.Forms.MouseEventHandler(PtbEqu_MouseDown);
--------------------编程问答-------------------- 楼上的兄弟,我确实是在释放资源前,没有把事件委托给去掉,这个会影响内存资源回收吗? --------------------编程问答-------------------- 没时间仔细研究,但我认为你可以在释放资源前把事件委托松绑,类似:
ptbEqu.MouseEnter -= new System.EventHandler(PtbEqu_MouseEnter);
ptbEqu.MouseDown -= new System.Windows.Forms.MouseEventHandler(PtbEqu_MouseDown);
--------------------编程问答-------------------- 不知道楼主解决没有,我也遇到同样的问题,在csdn上也没有搜索的解决的答案。
现在我解决了,把方法贴出来,方便以后大家解决这个问题。
原因是楼主这段代码有问题,没有完全释放控件
foreach (Control cl in ptbMap.Controls)
{
ptbMap.Controls.Remove(cl);
cl.Dispose();
}
正确的释放控件写法是:
Panel parentControl = panel_Bottom_Customer;//你的容器控件
while (parentControl.Controls.Count > 0)
{
if (parentControl.Controls[0] != null)
parentControl.Controls[0].Dispose();
}
--------------------编程问答-------------------- 在foreach 中改变,没有错?
foreach (Control cl in ptbMap.Controls)
{
ptbMap.Controls.Remove(cl);
cl.Dispose();
}
补充:.NET技术 , C#