C#无法访问已释放的资源

passwordException 2017-02-04 04:47:00
Panel p = (Panel)DAL.Commen.arrPanels[i];
this.splitContainer1.Panel1.Controls.Add(p);

这个窗体关闭后第二次打开就会报Panel已释放的错误。

就是这句代码,出错了。那个DAL.Commen.arrPanels是我设置的一个公共静态ArrayList,存放的是好多Panel对象。我测试了,可以调用出它来,只写上面那一句不会报错。然后下面那句把括号里的换成 new Panel()也不会报错。

怎么回事啊大神们= =
...全文
409 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
卧_槽 2017-02-06
  • 打赏
  • 举报
回复
conrtrol的close方法会隐试调用dispose方法,所以关闭窗口后,这个窗口被释放了。
passwordException 2017-02-04
  • 打赏
  • 举报
回复
我知道了大神,再看了几遍,瞬间顿悟,我不存对象了,我存文本就行,存文本就够了,这样就可以了吧。谢大神指导!
passwordException 2017-02-04
  • 打赏
  • 举报
回复
namespace DAL { public class Commen { public static String UserName=""; public static String nickName = ""; public static int newsX = 0; //消息盒子面板横坐标 public static int newsY = 0; //消息盒子面板纵坐标 public static ArrayList arrPanels = new ArrayList(); public static ArrayList arrNews = new ArrayList(); public static ArrayList arrSigns = new ArrayList(); } } 这是我的DAL类,充当测试数据库的
passwordException 2017-02-04
  • 打赏
  • 举报
回复
引用 2 楼 shingoscar 的回复:
简单的讲就是你关闭窗体的时候,DAL.Commen.arrPanels[i]已经被释放了,但是你没有从DAL.Commen.arrPanels中移除。 或者你应该在窗体关闭之前,将添加到this.splitContainer1.Panel1.Controls中的panel移除,然后再关闭窗体。
我是每次把生成的Panel存放到一个地方(现在存放到了一个静态数组里,测试成功后把静态数组换成存放到数据库中),然后下次窗体打开的时候,再把之前存放的加载出来,应该怎么改进啊大神
Poopaye 2017-02-04
  • 打赏
  • 举报
回复
形象点说就是你用绳子栓着一个球 把球放进一个箱子里 然后箱子连着球都被垃圾场回收了 就算你还拎着绳子也找不回那个球了。
Poopaye 2017-02-04
  • 打赏
  • 举报
回复
简单的讲就是你关闭窗体的时候,DAL.Commen.arrPanels[i]已经被释放了,但是你没有从DAL.Commen.arrPanels中移除。 或者你应该在窗体关闭之前,将添加到this.splitContainer1.Panel1.Controls中的panel移除,然后再关闭窗体。
passwordException 2017-02-04
  • 打赏
  • 举报
回复
对了,这句话写在窗体load事件中,和这个有没有关系。

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧