我有一个包含一堆OvalShapes的GroupBox,名为OvalShape1,OvalShape2等......
我正在尝试创建一个For Each循环来改变每个人的颜色。我的代码是这样的:
For Each childcontrol As OvalShape In GroupBox1.Controls
Dim opOv As OvalShape = childcontrol
Randomize()
opOv.BackColor = System.Drawing.ColorTranslator.FromWin32(RGB(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)))
Next
这给了我这个例外:
"无法关联类型的对象 ' Microsoft.VisualBasic.PowerPacks.ShapeContainer'输入 ' Microsoft.VisualBasic.PowerPacks.OvalShape'"
试试这个:
For Each childcontrol As OvalShape In GroupBox1.Controls
Randomize()
childcontrol.BackColor = System.Drawing.ColorTranslator.FromWin32(RGB(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)))
Randomize()
'childcontrol.BorderColor = System.Drawing.ColorTranslator.FromWin32(RGB(rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256)))
Next
给我同样的例外。
不,我还没有忘记将BackStyle设置为不透明。
我该如何解决这个问题?我想使用for each循环
更改OvalShapes的颜色帮助?
答案 0 :(得分:1)
MSDN在备注中有这样的说明:
LineShape,OvalShape或RectangleShape控件只能包含在ShapeContainer对象中,该对象充当线条和形状控件的画布。
在设计时向表单或容器添加行或形状时,如果尚不存在ShapeContainer,则会自动创建ShapeContainer。
正如错误消息所暗示的那样,椭圆是Shapes
的{{1}}集合。将您的代码更改为:
ShapeContainer
任何' get the shape container from the group's controls
' allows that there might be other controls
Dim myShapeCont = GroupBox1.Controls.OfType(Of ShapeContainer).FirstOrDefault
' iterate the ovals there
For Each oval As OvalShape In myShapeCont.Shapes
oval.BackColor = Color.FromArgb(255,
rnd.Next(0, 256), rnd.Next(0, 256), rnd.Next(0, 256))
Next
中只应该有一个ShapeContainer
。因此,这会将容器拿出来,然后迭代椭圆以设置背面颜色。
你可以通过ControlsCollection
循环,但是VB为你创造了这些,你无法看到它们,所以你不会知道这个名字是什么'除非你看一下设计师代码。其他说明:
ShapeContainer1.Shapes
类而不是VB Random
函数(函数的大小写错误,并且您正在传递Min和Max)。 Rnd
旨在与VB Randomize
函数一起使用,此处不起作用。Rnd
。上面的代码通过指定R,G,B值直接创建颜色。第一个值是ColorTranslator
或透明度。如果您厌倦了椭圆形,或者只是决定在混合中添加alpha
,那么在尝试将Rectangles
投射到Rectangle
时会出现类似的错误}。请将此用作循环:
Oval
For Each shape As SimpleShape In myShapeCont.Shapes
是所有PowerPack形状共有的基类,允许您设置所有形状的共同属性,例如SimpleShape
。