非常奇怪的问题,有关资源释放的问题
if (this.Controls.Count > 0) { //描绘之前将现有已经创建的button释放
CtlNum = this.Controls.Count;
for (i = 0; i < CtlNum; i++) {
this.Controls[i].Dispose();
}
this.Controls.Clear();
}
for (i = StartNum; i < DisplayNum; i++) {
abton = new button();
abton.Name = "abton " + i.ToString();;
this.Controls.Add(abton);
}
}
这些代码是放在自绘控件的onpaint里,编译顺利通过,只是在将该控件放到form里,发生运行时错误,报错为 "Cannot access a disposed object.
Object name: 'Button ' ".郁闷死我,不知道什么原因,按理由,不该报错的.找了1天,找不出原因
[解决办法]
不是很明白!
[解决办法]
不知道,up!
[解决办法]
要先收集子控件到数组,然后clear,然后用数组调用disposed。clear内部会访问子控件的属性,所以出异常。
[解决办法]
学习中~~
友情UP
[解决办法]
Control[] controls = new Control[panel1.Controls.Count];
panel1.Controls.CopyTo(controls, 0);
foreach (Control c in controls)
{
c.Dispose();
}
不用 clear,dispose 时自动从父控件中移除
[解决办法]
不能访问已被回收的对象
------解决方案--------------------
还是 clear 吧,这样
Control[] controls = new Control[panel1.Controls.Count];
panel1.Controls.CopyTo(controls, 0);
panel1.Controls.clear();
foreach (Control c in controls)
{
c.Dispose();
}
我也有点糊涂,你多试试
[解决办法]
把this.Controls[i].Dispose();
改为this.Controls.RemoveAt(i);
Add()和RemoveAt()是一对操作的。不要用Dispose();
[解决办法]
1、你的代码逻辑有问题
onpaint 事件:只要界面有变化,就会触发,所以,最好添加删除控件不要在这里进行,添加删除会自动调用onpaint 。
2、删除控件的顺序错误,ls 大致正确,详细如下
a、从事件中移除事件处理程序。在 Visual Basic 中,请使用 RemoveHandler 关键字;在 C# 中,请使用 -= 运算符。
b、使用 Remove 方法,从该面板的 Controls 集合中删除所需的控件。
c、调用 Dispose 方法,释放该控件使用的所有资源。
[解决办法]
试试:
if (this.Controls.Count > 0) { //描绘之前将现有已经创建的button释放
CtlNum = this.Controls.Count;
this.Controls.Clear();
}
for (i = StartNum; i < DisplayNum; i++) {
button abton = new button();
abton.Name = "abton " + i.ToString();;
this.Controls.Add(abton);
}
}
[解决办法]
for (i = 0; i < CtlNum; i++) {
this.Controls[i].Dispose();
}
这部分代码是没有必要
this.Controls.Clear();包括这部分功能