2016-05-30 94 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”)' –