首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

非常奇怪的有关问题,有关资源释放的有关问题

2012-02-09 
非常奇怪的问题,有关资源释放的问题if(this.Controls.Count0){//描绘之前将现有已经创建的button释放CtlN

非常奇怪的问题,有关资源释放的问题
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();包括这部分功能

热点排行