0

我已经从 MS 电源组创建了 40 个左右的 OvalShapes,当用户单击它们时,它们会发送一个 ID 到单独的函数,该函数应该改变单击的椭圆的颜色。不幸的是,该Controls方法似乎不起作用。

Controls.Item(Dummy).fillcolor = Color.Red给我一个错误,说“FillColor 不是 'System.Windows.Forms.Control' 的成员”,其中 Dummy 是包含控件名称的字符串。

我对 VB.NET 还很陌生,所以我不确定除了使用Controls. 谷歌在这个问题上并没有真正帮助太多,我发现的只是一种使用CType与椭圆类型匹配的所有控件上的所有形状搜索所有形状的方法,当我只想更改一个控件时这没有帮助......

编辑:我希望能够执行以下操作:

For i = 1 to 40
     OvalName = "Oval" & i
     if Ovali = then do something
Next
4

3 回答 3

2

我不确定您是如何添加 OvalShapes 或您使用的是什么类型的容器。为了将它们添加到 Windows 窗体控件,您需要使用 Slaks 提到的 shapeContainer。在此示例中,我创建了一个 shapeContainer 并将其添加到表单中,然后我使用 shapeContainers.Shapes.Add 方法将椭圆添加到ShapeCollection 类。我还将一个事件处理程序附加到椭圆的 Click 事件,以便我可以访问调用 Shape 以通过 EventHandler 的发送者对象更改其填充颜色。看看这是否适合你。

Imports Microsoft.VisualBasic.PowerPacks
Public Class Form1
    Dim offset As Integer = 0
    Dim OvalContainer As New ShapeContainer

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()
        OvalContainer.Size = New Size(Me.Width, 50)
        Me.Controls.Add(OvalContainer)
        OvalContainer.Location = New Point(0, 0)
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim oval As New OvalShape()

        oval.Size = New Size(30, 40)
        oval.Location = New Point(offset, 0)
        oval.FillStyle = FillStyle.Solid
        oval.FillColor = Color.Transparent
        oval.BorderColor = Color.Black
        oval.BorderWidth = 2
        AddHandler oval.Click, AddressOf ShapeClick
        OvalContainer.Shapes.Add(oval)

        offset += 40
    End Sub

    Private Sub ShapeClick(sender As Object, e As EventArgs)

        Dim oval As OvalShape = DirectCast(sender, OvalShape)
        If oval.FillColor.Equals(Color.Red) Then
            oval.FillColor = Color.Blue
        Else
            oval.FillColor = Color.Red
        End If

    End Sub

End Class

根据 OP 的说明进行编辑

当您创建椭圆添加时,oval.Name = "oval" & index这将添加名称属性,该属性将使以下代码能够工作。

您可以像这样遍历 Shapes 集合(这是基于我上面的示例):

For Each o As OvalShape In OvalContainer.Shapes
    If o.Name = "oval1" Then o.FillColor = Color.Azure
Next

ShapeContainer.Shapes.IndexOfKey或者您可以使用方法搜索您正在寻找的确切椭圆形

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim index As Integer = OvalContainer.Shapes.IndexOfKey("oval1")
    If index >= 0 Then
        DirectCast(OvalContainer.Shapes(index), OvalShape).FillColor = Color.Purple
    End If
End Sub
于 2014-05-20T02:44:17.237 回答
0

您需要将控件转换为,OvalShape以便您可以访问其属性:

DirectCast(Controls(Dummy), OvalShape).FillColor = Color.Red
于 2014-05-19T00:54:50.740 回答
0
Dim MyOval As PowerPacks.OvalShape

For Each ThisControl As PowerPacks.Shape In ShapeContainer1.Shapes
    If TypeOf (ThisControl) Is PowerPacks.OvalShape Then
        MyOval = DirectCast(ThisControl, PowerPacks.OvalShape)
        If MyOval.Name.ToString = ("p36") Then
            MyOval.BackColor = Color.Black
        End If
    End If
Next
于 2015-08-26T06:54:06.960 回答