Как ссылаться на динамически создаваемый 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