2014-05-19 38 views
0

我已經從MS power pack中創建了40個左右的OvalShapes,當用戶單擊它們時,它們會發送一個ID來分隔函數,該函數應該更改顏色被點擊的橢圓形。不幸的是,Controls方法似乎不起作用。如何使用vb.net中的字符串變量引用動態創建的OvalShape

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 

回答

2

我我不確定你怎麼樣正在添加您的OvalShapes或您正在使用的容器類型。爲了將它們添加到Windows窗體控件中,您需要使用Slaks提到的shapeContainer。在這個例子中,我創建一個shapeContainer並將其添加到窗體,然後我使用shapeContainers.Shapes.Add方法將橢圓添加到ShapeCollection Class。我還將一個事件處理程序附加到橢圓的Click事件中,以便我可以訪問調用的Shape以通過EventHandler的sender對象更改其填充顏色。看看這是否會爲你工作。每個操作的澄清

當您創建橢圓

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 
+0

我發現這對我需要做的第一部分非常有用,特別是因爲我已經有一個事件處理程序已經內置到橢圓中。現在我只需要能夠引用他們,當我點擊一個按鈕,所以我可以得到他們的狀態。我知道我可以在需要的時候明確地調出每個橢圓,但是當你有大量的對象時,這是非常不切實際的。我正在尋找的東西就像我編輯的原始問題。 – 110SidedHexagon

+0

@ 110SidedHexagon查看我剛剛編輯的編輯是否可以幫助你 –

+1

完美無缺! – 110SidedHexagon

0

你需要控制轉換爲OvalShape這樣你就可以訪問它的屬性:

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

它給我一個錯誤的'控制(僞)':「值類型‘System.Windows.Forms.Control的’無法轉換爲「M icrosoft.VisualBasic.PowerPacks.OvalShape'「 – 110SidedHexagon

+0

@ 110SidedHexagon:Sorry;嘗試這個。 – SLaks

+1

沒有骰子,仍然在同一個地方給出同樣的錯誤。我的猜測是OvalShape是一個PowerPack對象,而不是一個表單控件。 – 110SidedHexagon

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 
相關問題