2016-12-30 5 views
0

Ich versuche, Bildboxen dynamisch in vb.net hinzuzufügen.Event-zu-Bild-Box dynamisch hinzufügen vb.net

Wenn ich mit den Vars spiele und den Wert "i" ändere, kann ich die Bilder und das Event zur letzten PictureBox hinzufügen (ich kann nur auf die letzten Bilder klicken).

Aber wenn ich den Code unten verwende, sagt es, dass es etwas außerhalb der Grenzen (Index außerhalb der Grenzen der Matrix) gibt.

Was mache ich falsch? EDIT tks

Imports System.IO 

Public Class FormMain 
Dim Path1 As String = Path.GetDirectoryName(Application.ExecutablePath) & "\Source\Images\1.png" 
Dim Path2 As String = Path.GetDirectoryName(Application.ExecutablePath) & "\Source\Images\2.png" 

Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    CreateImages() 
End Sub 

Dim i As Integer 
Dim Logo(i) As PictureBox 

Sub CreateImages() 
    Dim i As Integer = TextBoxNumberImages.Text 

    For i = 0 To i - 1 
     Logo(i) = New PictureBox 
     Logo(i).Name = "Image" + Str(i) 
     Panel1.Controls.Add(Logo(i)) 
     Logo(i).Image = Image.FromFile(Path1) 
     Logo(i).SizeMode = PictureBoxSizeMode.StretchImage 

     AddHandler Logo(i).Click, AddressOf _Click 

    Next 
End Sub 

'------ADD EVENT---- 

Dim IsImageSelected(i) As Boolean 

Private Sub _Click(ByVal sender As Object, ByVal e As EventArgs) 

    If IsImageSelected(i) = False Then 
     Logo(i).Image = Image.FromFile(Path2) 
     IsImageSelected(i) = True 
    Else 
     Logo(i).Image = Image.FromFile(Path1) 
     IsImageSelected(i) = False 
    End If 
End Sub 

---- ----

Ich habe gerade die var Erklärung innerhalb der Funktion:

Sub CreateImages() 
    Dim i As Integer = TextBoxNumberImages.Text 
    Dim Logo(i) As PictureBox 

    For i = 0 To i - 1 
     Logo(i) = New PictureBox 
     Logo(i).Name = "Image" + Str(i) 
     Panel1.Controls.Add(Logo(i)) 
     Logo(i).Image = Image.FromFile(Path1) 
     Logo(i).SizeMode = PictureBoxSizeMode.StretchImage 

     AddHandler Logo(i).Click, AddressOf _Click 

    Next 
End Sub 

Nun schafft es die Bilder so, wie ich will, aber ich kann nicht auf die Picture Boxes im Ereignis zugreifen. Hilfe?

+0

Zuerst Option Strict einschalten. dann lesen Sie [Scope in VB] (http://stackoverflow.com/a/33249045/1070452). DIM erstellt jedes Mal ein neues, anderes Logo-Array, also haben Sie wirklich 2-3 davon. Da Sie nicht wissen, wie viele es bis zur Laufzeit gibt, verwenden Sie eine Liste und nicht ein Array – Plutonix

+0

@Plutonix ja ich erkannte, dass jetzt. Danke, die obige Antwort ist perfekt. Ty –

+1

Nein. "Perfect" würde Option Strict implementieren – Plutonix

Antwort

0

Verwenden Sie kein Array, sondern eine List (Of PictureBox). Sie können den ausgewählten Status auch im Tag() der PictureBox speichern. Um einen Verweis auf die angeklickte PictureBox zu erhalten, müssen Sie den Parameter Sender übergeben. Alles zusammen würde in etwa so aussehen:

Private Logo As New List(Of PictureBox) 

Sub CreateImages() 
    Dim i As Integer = TextBoxNumberImages.Text 

    For i = 0 To i - 1 
     Dim pb As New PictureBox 
     pb = New PictureBox 
     pb.Tag = False ' <-- initial not selected state 
     pb.Name = "Image" + Str(i) 
     Panel1.Controls.Add(pb) 
     pb.Image = Image.FromFile(Path1) 
     pb.SizeMode = PictureBoxSizeMode.StretchImage 
     AddHandler pb.Click, AddressOf _Click 
     Logo.Add(pb) 
    Next 
End Sub 

Private Sub _Click(ByVal sender As Object, ByVal e As EventArgs) 
    Dim pb As PictureBox = DirectCast(sender, PictureBox) 
    Dim selected As Boolean = DirectCast(pb.Tag, Boolean) 
    If selected = False Then 
     pb.Image = Image.FromFile(Path2) 
    Else 
     pb.Image = Image.FromFile(Path1) 
    End If 
    pb.Tag = Not selected ' toggle selected state 
End Sub 
+0

Danke! Und ich schätze wirklich die Idee der Verwendung des "Tags" –

+0

Wenn Sie auf die PBs in der Liste zugreifen müssen, können Sie weiterhin auf sie zugreifen "nach Index" ähnlich einem Array: 'Logo (i) .xxx = yyy' –