2013-05-01 164 views
0

当下面的代码运行时,任何一个ImagePanel在其Control集合中都有一个控件,并且orImagePanel的Control集合为空。我意识到,当我添加到一个集合中时,其他集合就会被清空。有谁知道为什么?将同一图像对象添加到集合中会从第一个添加的集合中删除图像

Image imageOff = new Image(); 
imageOff.Attributes["style"] = "display:inline-Block; overflow:hidden;"; 
imageOff.ImageUrl = "/Off.png"; 

Image etherImage = imageOff; 
Image orImage = imageOff; 

orImagePanel.Controls.Add(orImage); 
eitherImagePanel.Controls.Add(etherImage); 

回答

1

因为控件不能是两个不同面板的子项。您需要克隆图像对象。目前,您只是使用相同的对象引用创建2个变量。

Image etherImage = new Image(); 
etherImage .Attributes["style"] = "display:inline-Block; overflow:hidden;"; 
etherImage .ImageUrl = "/images/webdataentry/Off.png"; 

Image orImage = new Image(); // New Object! thats the key. 
orImage .Attributes["style"] = "display:inline-Block; overflow:hidden;"; 
orImage .ImageUrl = "/images/webdataentry/Off.png"; 

orImagePanel.Controls.Add(orImage); 
eitherImagePanel.Controls.Add(etherImage); 

将工作。你也可以使用Clone方法上imageOff

http://msdn.microsoft.com/de-de/library/system.drawing.image.clone.aspx

编辑:您的评论: 每个controlcontrols -Collection而只是一个单亲属性。当使用a.controls.add(b)时,也调用b.setParent(a)。由于这是一个1:n关系,将您的控件添加到另一个面板,将再次调用setParent并覆盖第一个父项。

http://msdn.microsoft.com/de-de/library/system.windows.forms.control.parent.aspx

完全控制布局是一个树。每个根有许多叶子,但叶子只能有一个根。

+0

控件不能成为多个面板的孩子的原因是什么? – neo 2013-05-01 19:30:14

+0

你说每个控件都有一个控件集合,但为什么像TextBox这样的控件会有一个控件集合?每个容器控件都有控件集合。你能指出一个关于这个父母被设置的资源吗? – neo 2013-05-01 19:39:27

+0

@neo TextBox扩展了Control,因此它通过继承获取controls-collection:http://msdn.microsoft.com/en-us/library/system.windows.controls.textbox(v=vs.95).aspx。 – dognose 2013-05-02 15:08:44

相关问题