【发布时间】:2014-05-23 13:35:11
【问题描述】:
抱歉,标题有点奇怪。让我概述一下情况:
我有一个名为 TrafficInfraction 的 general usercontrol。
来自该 TrafficInfraction 的 2 个其他用户控件 inherit。让他们称之为超速停车。 De方案如下:
TrafficInfraction
Speeding (Inherits from TrafficInfraction + Has 2 extra buttons)
Parking (Inherits from TrafficInfraction + Has 1 extra textbox & 1 extra button)
添加运行时我想将cast Speeding/Parking 用户控件添加到TrafficInfraction 类型的用户控件(在指定的表单上,我不需要额外的控件)。
我知道它可以使用如下的浅拷贝(fIntractions 是flowlayoutpanel):
注意:currTrafficInfractions 是 TrafficInfraction 的集合 (List Of)。它可以包含从trafficInfraction继承的普通trafficInfraction和用户控件:Speeding,Parking,....(可能进一步派生用户控件)。 currTrafficInfractions 是根据在 base-Control(TrafficInfraction) 上定义的属性填充的。该属性名为“Fine”,为double。将 Fine 大于 100(例如)的所有用户控件添加到列表中。
For Each infra As TrafficInfraction In currTrafficInfractions
fInfractions.Controls.Add(infra.Clone())
Next
但我不想要浅拷贝(因为我显然失去了某些属性:工具提示,...)并且想要对象本身。所以我认为它会像这样工作:
For Each infra As TrafficInfraction In currTrafficInfractions
fInfractions.Controls.Add(Ctype(infra,TrafficInfraction))
Next
或
For Each infra As TrafficInfraction In currTrafficInfractions
fInfractions.Controls.Add(infra)
Next
但事实证明我错了。布局不会改变(与.Clone 的效果不同)。我仍然看到那些额外的控件。简单地隐藏它们是行不通的。因为在 Speeding & Parking 上控件的位置(继承自 TrafficInfraction)是不同的。
问题:如何将用户控件转换/转换为其基本用户控件的布局。并将其正确显示为TrafficInfraction 给用户(没有在Speeding 或Parking 中声明的额外控件)?
注意: TrafficInfraction 实现 IClonable 。这可能是.Clone 取得一些成功的原因。
【问题讨论】:
-
什么是
currTrafficInfractions? -
更新了问题:currTrafficInfractions 是 Trafficinfractions 的集合。
-
由谁拥有和填补?
-
显示它的具体类型;什么样的收藏?是
List(Of traffics)还是Microsoft.VisualBasic.Collection? -
抱歉:它是一个“列表(Of )”。 (很快就会用一些额外的信息更新“注释”!
标签: vb.net inheritance user-controls