Как ссылаться на динамически создаваемый OvalShape с помощью строковой переменной в vb.net

Я создал 40 или около того OvalShapes из блоков питания MS, и когда пользователь щелкает их, они отправляют идентификатор отдельной функции, которая должна изменять цвет щелкаемого овала. К сожалению Controls Кажется, метод не работает.

Controls.Item(Dummy).fillcolor = Color.Red выдает ошибку, в которой говорится, что "FillColor не является членом System.Windows.Forms.Control", где Dummy - строка, содержащая имя элемента управления.

Я довольно новичок в VB.NET, поэтому я не уверен, есть ли другой способ ссылаться на вещи в форме через строку, кроме использования Controls, Google на самом деле не очень помог в этом вопросе, все, что я нашел, это способ поиска по всем формам с использованием CType на всех элементах управления, которые соответствуют овальному типу, который не помогает, когда я просто хочу изменить один элемент управления...

Изменить: я хочу быть в состоянии сделать что-то вроде следующего:

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

3 ответа

Решение

Я не уверен, как вы добавляете свои OvalShapes или какой тип контейнера вы используете. Чтобы добавить их в элемент управления Windows Form, вам нужно будет использовать shapeContainer, как упомянуто Slaks. В этом примере я создаю shapeContainer и добавляю его в форму, затем использую метод shapeContainers.Shapes.Add для добавления овала в класс ShapeCollection. Я также присоединяю обработчик событий к событию Click овалов, чтобы получить доступ к вызывающей фигуре, чтобы изменить ее цвет заливки через объект отправителя 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

Редактировать для разъяснения ОП

Когда вы создаете свои овалы добавить oval.Name = "oval" & index это добавит свойство name, которое позволит работать следующему коду.

Вы можете перебрать коллекцию 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
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

Вы должны наложить контроль на OvalShape так что вы можете получить доступ к его свойствам:

DirectCast(Controls(Dummy), OvalShape).FillColor = Color.Red
Другие вопросы по тегам