我在一个form窗体上添加了一个Panel控件,在Panel上添加了四个控件,在panel外的窗体上添加了一个button控件。我想实现点击button按钮panel上的控件就消失。我在Pannel控件里写了个这样的语句
private void button1_Click(object sender, EventArgs e)
{
foreach (Control c in this.panel1.Controls)
{
c.Dispose();
}
}
但是是,实际运行效果是点击button之后只要两个控件消失了,再点击又消失两个。我不明白为什么。是语句写错了吗?我想知道这个语句哪出错了。
private void button1_Click(object sender, EventArgs e)
{
foreach (Control c in this.panel1.Controls)
{
c.Dispose();
}
}
但是是,实际运行效果是点击button之后只要两个控件消失了,再点击又消失两个。我不明白为什么。是语句写错了吗?我想知道这个语句哪出错了。
解决方案 »
- Window service start Workflow
- 请问 Winamp 的活泼界面是如何制作?
- 关于GetDirectories的问题
- 如何控制定时器timer弹出的winform
- 问一个增加不同数据到数据库的算法问题
- 关于WORD中,range的定位问题(C#2005)
- 如何获取局域网中的所有 SQL Server 服务器(给点意见也可,UP无分)
- 虚惊一场,散分100,以保平安!呵呵
- 关于 用 c# asp.net web 应用程序
- C# Activx 分块上传大文件时能由Activx来完成合并分块的工作吗
- 怎么做才能将tagcontrol中的一个tagepage设置为隐藏或者达到enable=false的效果?
- 三层的增删改查
{
foreach (Control c in this.panel1.Controls)
{
c.Visible=false;
}
}
{
foreach (Control c in this.panel1.Controls)
{
c.Visable=false;
}
}或者private void button1_Click(object sender, EventArgs e)
{
int count=this.panel1.Controls.Count;
for(int i=count-1;i>=0;i--)
{
Control c = this.panel1.Controls[0];
c.Visable=false;
}
}
private void button1_Click(object sender, EventArgs e)
{
foreach (Control c in this.panel1.Controls)
{
c.Hide();
}
}
我不太明白。怎么改变了Controls的大小。能详细解释下吗?我刚开始学C#。。这个问题我百度了好久也没百度 出来
我也不明白Control.Dispose中都干了些什么事,导致Controls大小的变化,不过从以下试验可以得出结论:
while (this.panel1.Controls.Count > 0)
{
this.panel1.Controls[0].Dispose();
MessageBox.Show(this.panel1.Controls.Count.ToString());//报出的值越来越小
}
调用dispose方法之后控件直接释放,也就是说panel的子控见总数自然你就少了。这个问题应该出在foreach语句遍历这个集合的问题上面具体什么问题就只能期待大神回答了。。
嗯。我就是这么认为的。dispose方法是释放一个控件占有的所有资源。就是说这个控件彻底消失了。和Hide方法是不一样的。
这个真会,我试过了,查了查IL,内容太多,没找到.Net是在哪个位置实现的
if (this.parent != null)
{
this.parent.Controls.Remove(this);
}
还有一个比较诡异的问题。微软提供的源码中,ControlCollection的枚举器是做了集合改变检查的,检查到集合改变了也抛出了异常来中断枚举。
但实际上发行的.NET程序集里面又没有检查集合的更改。而且那个代码也比较奇怪,似乎暗示了它知道在迭代过程中集合会被改变(所以检查了this.controls.Count)
public bool MoveNext()
{
if ((this.current < (this.controls.Count - 1)) && (this.current < (this.originalCount - 1)))
{
this.current++;
return true;
}
return false;
}
莫非是因为某种原因故意这么实现的
虽然dispose掉了 只是把这个资源释放掉了 这个变量名却还是存在的
就像
Form frm = new Form();
frm.Name = "Test";
frm.Show();
frm.Dispose();
MessageBox(frm.Name);
虽然被dispose掉了 但是还是可以访问frm对象 直到frm的生命周期结束
如果 用remove的话 那么就会影响controls的大小了、、
好吧 我只是过来打酱油的、、、