【问题标题】:How to reference a dynamically created OvalShape with a string variable in vb.net如何在 vb.net 中使用字符串变量引用动态创建的 OvalShape
【发布时间】:2014-05-19 00:50:41
【问题描述】:

我已经从 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

【问题讨论】:

    标签: .net vb.net winforms controls powerpacks


    【解决方案1】:

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

    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
    

    【讨论】:

    • 我发现这对于我需要做的前半部分非常有用,特别是因为我已经在椭圆中内置了一个事件处理程序。现在我只需要能够在单击按钮时引用它们,以便获取它们的状态。我知道我可以在需要时明确地调用每个椭圆,但是当你有大量对象时这样做是非常不切实际的。我正在寻找的内容类似于我在原始问题上编辑的内容。
    • @110SidedHexagon 看看我刚刚做的编辑对你有没有帮助
    【解决方案2】:

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

    DirectCast(Controls(Dummy), OvalShape).FillColor = Color.Red
    

    【讨论】:

    • 它在Controls(Dummy) 上给了我一个错误:“'System.Windows.Forms.Control' 类型的值不能转换为'Microsoft.VisualBasic.PowerPacks.OvalShape'”
    • @110SidedHexagon:对不起;试试这个。
    • 没有骰子,仍然在同一个地方给出同样的错误。我的猜测是 OvalShape 是 PowerPack 对象而不是表单控件。
    • @110SidedHexagon:你说得对;使用shapeContainer.Shapes
    • 查看 MSDN 后,我不确定如何实现 shapeContainer.Shapes 来设置形状的属性...抱歉,如果这很明显,但我所尝试的一切都给了我一个或另一个错误。
    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 2014-09-06
      • 2015-08-15
      • 2019-09-11
      • 2012-11-01
      • 1970-01-01
      • 2022-06-25
      • 2014-01-22
      • 2014-08-26
      • 1970-01-01
      相关资源
      最近更新 更多