【求助】控件循环遍历,添加的问题!!!

dyshadow 2008-06-03 06:09:05
用循环遍历窗体中的控件十分简单:
假设存在Form1,Form2;
Form1中存在一个BUTTON1
Form2中存在两个控件,一个LABEL1,一个BUTTON1

以下是BUTTON1的CLICK事件
Form2 frmTarget=new Form2();
foreach (Control ctl in frmTarget.Controls)
{
MessageBox.Show(ctl.Text);
}

结果运行正常,MESSAGEBOX显示两次,“Button1”和“Label1”

但是,如果执行以下代码:
foreach (Control ctl in frmTarget.Controls)
{
this.Controls.Add(ctl);
MessageBox.Show(ctl.Text);
}
MessageBox只显示一次,“Button1”,同时窗体中也只添加了Button1这个控件。

为了解决这个问题,我不得不添加一个List<Control>来暂时存放控件信息。

Form2 frmTarget = new Form2();
List<Control> ctlCol = new List<Control>();
foreach (Control ctl in frmTarget.Controls)
{
ctlCol.Add(ctl);
}
foreach (Control ctl in ctlCol)
{
this.Controls.Add(ctl);
}
问题是解决了,但是这代码看着就另人不爽,请教大虾们,这是什么原因导致的?有没有更加好的方法?
...全文
93 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dyshadow 2008-06-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fuadam 的回复:]
你这个需求真怪异,不过试了一下确实想你说的。执行this.Controls.Add(ctl); 以后frmTarget.Controls的控件就会少一个,不知道原因。不过你可以这样写

for(int i=0; i <=frmTarget.Controls.Count; ++i)
{
this.Controls.Add(frmTarget.Controls[0]);
}
[/Quote]


这样不行,还是只能添加一个控件。根据你思路,稍微改了下:
int iCount = frmTarget.Controls.Count;
for (int i = 0; i < iCount; i++)
this.Controls.Add(frmTarget.Controls[0]);
就好了。
dyshadow 2008-06-04
  • 打赏
  • 举报
回复
看来还是需要那段看似冗余的循环。多谢各位,结帖咯!
csharp_start 2008-06-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fuadam 的回复:]
引用 4 楼 amandag 的回复:
这个问题的原因很简单..

楼主把foreach (Control ctl in frmTarget.Controls)前加一个frmTarget.Show()就明白了

foreach的时候还有两个控件,你把一个加到Form1了,frmTarget.Controls里的控件就少了一个,当然循环条件不满足,直接退出了

我想问问这位朋友,为什么窗体A添加窗体B的控件后,控件会从B窗体中移除
[/Quote]
一个对象实体只能属于一个parent.
fuadam 2008-06-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 amandag 的回复:]
这个问题的原因很简单..

楼主把foreach (Control ctl in frmTarget.Controls)前加一个frmTarget.Show()就明白了

foreach的时候还有两个控件,你把一个加到Form1了,frmTarget.Controls里的控件就少了一个,当然循环条件不满足,直接退出了
[/Quote]
我想问问这位朋友,为什么窗体A添加窗体B的控件后,控件会从B窗体中移除
amandag 2008-06-03
  • 打赏
  • 举报
回复
这个问题的原因很简单..

楼主把foreach (Control ctl in frmTarget.Controls)前加一个frmTarget.Show()就明白了

foreach的时候还有两个控件,你把一个加到Form1了,frmTarget.Controls里的控件就少了一个,当然循环条件不满足,直接退出了
fuadam 2008-06-03
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 SuperTyro 的回复:]
我不是大虾 但是 代码我稍微看明白了一点
原因应该在 this.Controls.Add(ctl);
这条语句上 因为你将ctl添加到了controls 中 然后controls 应该有一个自己刷新的操作
这样 你的foreach 循环就被终止了
可以将你的上面的代码改成这样

for (int i=0;i <frmTarget.Controls.Count;.i++)
{
this.Controls.Add(frmTarget.Controls[i]);
MessageBox.Show(frmTarget.Controls[i].Text);
}

这样就应该可…
[/Quote]
你这样不行,this.Controls.Add(frmTarget.Controls[i]); 以后frmTarget.Controls变少了。所以你这段代码还是只有一个控件
SuperTyro 2008-06-03
  • 打赏
  • 举报
回复
我不是大虾 但是 代码我稍微看明白了一点
原因应该在 this.Controls.Add(ctl);
这条语句上 因为你将ctl添加到了controls 中 然后controls 应该有一个自己刷新的操作
这样 你的foreach 循环就被终止了
可以将你的上面的代码改成这样

for (int i=0;i<frmTarget.Controls.Count;.i++)
{
this.Controls.Add(frmTarget.Controls[i]);
MessageBox.Show(frmTarget.Controls[i].Text);
}

这样就应该可以了

我是小菜鸟! 说的不好清见谅, 希望能够帮到你!
fuadam 2008-06-03
  • 打赏
  • 举报
回复
你这个需求真怪异,不过试了一下确实想你说的。执行this.Controls.Add(ctl); 以后frmTarget.Controls的控件就会少一个,不知道原因。不过你可以这样写

for(int i=0; i<=frmTarget.Controls.Count; ++i)
{
this.Controls.Add(frmTarget.Controls[0]);
}

110,565

社区成员

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

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

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