2016-05-30 95 views
0

我在Visual Basic中創建了一個程序,通過單擊PictureBox來打開文件,但是結果是,我已經結束了36個圖片框,並且很痛苦處理他們中的每一個,因爲只有這樣,我發現引用的PictureBox(Nº) 正在作出
Dim pictureBoxes(35) As PictureBox具有相同名稱的Visual Basic句柄和多個變量

,並設定每一個如下:

pictureBoxes(0) = PictureBox1 
pictureBoxes(1) = PictureBox2 
pictureBoxes(2) = PictureBox3 
... 
pictureBoxes(35) = PictureBox36 

然後,我可以用它在For循環中:

PictureBoxes(i).Image = iconForFile.ToBitmap() 

所以,我的問題是,有沒有辦法讓它更容易引用,而不是這樣做?
同樣的事情還挺讓我在代碼的手柄部分納悶:

Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click, PictureBox2.Click, PictureBox3.Click, PictureBox4.Click, PictureBox5.Click, PictureBox6.Click, PictureBox7.Click, PictureBox8.Click, PictureBox9.Click, PictureBox10.Click, PictureBox11.Click, PictureBox12.Click, PictureBox13.Click... 

任何光線將是非常有益的,謝謝!

+0

你可以嘗試在一個循環中使用它,並以相同的方式設置值,用循環。然後在同一個循環中聲明事件句柄。 – ib11

+0

Handles關鍵字對於設計師來說很不錯。在代碼中使用AddHandler語句。這使得爲​​所有的pbs提供相同的事件處理程序,只是一個For循環而言,它是微不足道的。 –

+0

@HansPassant,單獨使用每個圖片框的選擇是精確地查看已經選擇了哪個圖片框,如果通過for循環設置了一個事件處理程序,它可能會爲所有這樣設置的圖片框提供相同的結果 –

回答

1

我不知道你的控件是如何在窗體上構造的,但是如果它們是同一個集合的一部分,例如一個流程面板,你可以獲得某種類型的所有控件。在你的情況下,你希望能夠訪問單個盒子,所以你可以做一次,並將盒子存儲在列表中,就像你已經在做的那樣。

Dim pictureBoxes = FlowLayoutPanel.Controls.OfType(Of PictureBox)().Tolist() 
For Each picture in pictureBoxes 
    AddHandler picture.Click, AddressOf PictureBox_Click 
Next 
+0

我不認爲'ToList'在這裏是必需的,但它仍然有效。 –

+0

這的確非常有幫助,謝謝!只是一個簡單的問題,我將如何參考每個圖片框添加? –

+0

您仍然需要通過索引來引用它們,或者使用'.Find()'如果它們具有適當的唯一名稱,例如:Dim selectedBox = pictureBoxes.Find(Function(p)p.Name =「MyComputerPictureBox」)' –