c#删除窗体控件

jackeyabc 2008-08-01 09:58:48
窗体上有10几个动态添加的label控件,现在想根据name一次性删除,但是遍历删除只会删除一半
为什么,应该是这10几个都会删除~~~

?
...全文
963 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yun__ 2012-08-17
  • 打赏
  • 举报
回复
如果是使用循环的话。。 从后面向前面删除。。 就会删除完整了。。
XUQIONG123456 2012-08-17
  • 打赏
  • 举报
回复
学到知识了
E次奥 2012-08-17
  • 打赏
  • 举报
回复
主要是Lz删除一个后集合的长度变化了。导致只能删除一半。
独孤侠客 2012-08-17
  • 打赏
  • 举报
回复
经过我实例操作验证8楼是正确的,其他有问题的。
opopopo_1 2011-07-20
  • 打赏
  • 举报
回复
支持楼上的!~
千念 2011-07-20
  • 打赏
  • 举报
回复
是不是这年头for循环只用来递增了?

for (int i = this.Controls.Count - 1; i >= 0; i--)
{
if (this.Controls[i] is Label)
{
this.Controls.RemoveAt(i);
}
}
  • 打赏
  • 举报
回复
最简单的代码来了
====================================
private void button6_Click(object sender, EventArgs e)
{
for (int i = 0; i < this.Controls.Count; i++)
{
if (Controls[i] is Label)
{
this.Controls.Remove(Controls[i]);
i--;
}

}
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
bauer99 2011-07-18
  • 打赏
  • 举报
回复
真理总是后来出现,前面总是审题不仔细。
jackeyabc 2008-08-01
  • 打赏
  • 举报
回复
问题已经解决,跟大家共享,其实楼上几位的也不能解决问题,我刚刚也是按照那个方法~~~

public static void RemoveControl(Control c,string R_name)
{
int i = 0;
object[] obj = new object[ControlCount(c, R_name)];

foreach (Control ch in c.Controls)
{
if ((ch is Label))
{
if (ch.Name.Substring(0, 2) == R_name)
{
obj[i] = ch;
i++;
}

}
}
for (int x = 0; x < obj.Length; x++)
{
c.Controls.Remove((Label)obj[x]);
}
}
wsxqaz 2008-08-01
  • 打赏
  • 举报
回复
现在想想楼上说的有理
baihe_591 2008-08-01
  • 打赏
  • 举报
回复
解决方法:

for(int i=0;i<this.Controls.Count;i++)
{//注意:Controls中的控件是动态变化的.
foreach(Control con in this.Controls)
{
if(con is Label)
this.Controls.Remove(con);
}
}

baihe_591 2008-08-01
  • 打赏
  • 举报
回复
[Quote=引用楼主 jackeyabc 的帖子:]
窗体上有10几个动态添加的label控件,现在想根据name一次性删除,但是遍历删除只会删除一半
为什么,应该是这10几个都会删除~~~

?
[/Quote]

这是因为在foreach遍历时,删除控件,使得this.controls发生了变化.少了数据元素,结果只能删除一半.

zck98530 2008-08-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 slin60 的回复:]
C# code
private void delLabel(control con){
foreach (Control obj in con.Controls ){
if (obj.GetType.ToString() = "System.Windows.Forms.Label") //如果控件是lable
{
//此时只要执行你的删除控件代码即可
}
delLabel(obj);
}
}



调用时传this进去就行了
[/Quote]
学习
slin60 2008-08-01
  • 打赏
  • 举报
回复

private void delLabel(control con){
foreach (Control obj in con.Controls ){
if (obj.GetType.ToString() = "System.Windows.Forms.Label") //如果控件是lable
{
//此时只要执行你的删除控件代码即可
}
delLabel(obj);
}
}

调用时传this进去就行了
jackeyabc 2008-08-01
  • 打赏
  • 举报
回复
给一个递归代码啊,三位LS的~~~
多谢
睡神在睡觉 2008-08-01
  • 打赏
  • 举报
回复
没说的,递归
yuanleijiwei 2008-08-01
  • 打赏
  • 举报
回复
foreach (Control obj5 in this.Controls )//判断界面上的控件 {
if (obj5.GetType.ToString() = "System.Windows.Forms.Label") //如果控件是lable
{
//此时只要执行你的删除控件代码即可
}
}
wsxqaz 2008-08-01
  • 打赏
  • 举报
回复
递归 谢谢
卧_槽 2008-08-01
  • 打赏
  • 举报
回复
for(int i=0 i< this.Controls.Count;i++ )//判断界面上的控件
{
Control obj5=this.Controls[i];

if (obj5.GetType.ToString() = "System.Windows.Forms.Label") //如果控件是lable
{
this.Controls.Remove(i);
i--;
//此时只要执行你的删除控件代码即可
}
}
加载更多回复(4)

110,533

社区成员

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

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

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