当前位置:编程学习 > C#/ASP.NET >>

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#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,