2016-12-30 2 views
0

vb.netでピクチャボックスを動的に追加しようとしています。イベントをピクチャボックスに動的に追加するvb.net

"i"の値を変更すると、作成した最後の画像ボックスに画像とイベントを追加できます(最後の画像のみをクリックできます)。

しかし、私は以下のコードを使用すると、境界から外れているものがあると言います(インデックスはマトリックスの境界外にあります)。

私は間違っていますか? 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 

---- EDIT ----

私は、関数の内部にVAR宣言を変更:

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 

は、今では、画像に私が望む方法を作成しますイベントのピクチャボックスにアクセスすることはできません。助けて?

+0

最初にOption Strictをオンにします。 [Scope in VB](http://stackoverflow.com/a/33249045/1070452)を読んでください。 DIMは新しいロゴ配列を毎回作成していますので、実際には2-3個あります。ランタイムまで何個あるか知りませんので、配列ではなくリストを使用してください – Plutonix

+0

@Plutonixはい、私はそれを今実現しました。ありがとう、上記の答えは完璧です。 Ty –

+1

いいえ「パーフェクト」はOption Strictを実装します – Plutonix

答えて

0

代わりにList(Of PictureBox)を使用して配列を使用しないでください。選択した状態をPictureBoxのTag()に保存することもできます。クリックされたPictureBoxへの参照を取得するには、Senderパラメータをキャストします。一緒に見ると、次のようになります。

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

ありがとうございます!そして、私は本当に 'tag 'を使う考えを恥ずかしく思っています。 –

+0

リストの中のPBにアクセスする必要があるならば、配列に似た"インデックスで "アクセスすることができます:' Logo(i).xxx = yyy' –

関連する問題