2013-01-02 28 views
2

在Visual Basic 2010表單應用程序,我有下面的代碼片段:動態通過圖片框控件在Visual Basic 2010循環似乎並不遵循任何順序

For Each ctlControl In Me.Panel1.Controls 
    If TypeName(ctlControl) = "PictureBox" Then 
     ctlControl.image = Nothing 
    End If 
Next ctlControl 

我的問題是,當它遍歷控件它並不以左上角的控件開始,它似乎以隨機順序遍歷每個圖片框。

如何控制下一個圖片框的更新順序。是否有一個屬性類似於Tab索引(在VB 6中),我可以通過操作來控制圖片框被循環更新的順序?

+0

難道要由TabIndex屬性? – George

+0

不,只需要按順序處理它們 –

+0

如何將圖片框添加到窗體中:是通過代碼動態添加還是通過IDE添加?如果動態,那麼我建議使用控制數組。 – George

回答

0

由於其他一些人說你可以使用TAG屬性,這可能是最佳拍攝,當你動態創建圖片框時,使用計數器並將計數器值添加到TAG屬性。如果您手動添加圖片框,則只需從左上​​角開始並向右移動,並在每個標籤的TAG屬性字段中添加一個值,從1開始,每次增加1,並繼續,直到行完成,然後繼續與下一行。

最後,當通過圖片框您準備環路只需按照下面的方式..

'Calc number of picture boxes 
For Each ctlControl In Me.Panel1.Controls 
    If TypeName(ctlControl) = "PictureBox" Then 
    Counter = Counter + 1 
    End If 
Next ctlControl 
ThisBox = 1 
Do 
    For Each ctlControl In Me.Panel1.Controls 
    If TypeName(ctlControl) = "PictureBox" Then 
     If CInt(ctlControl.Tag) = ThisBox Then 
     CLEAR-YOUR-IMAGE-HERE 
     ThisBox = ThisBox + 1 
     End If 
    End If 
    Next ctlControl 
Loop Until ThisBox = Counter 

注: 其重要的你的號碼,你在TAG屬性將是連續的,否則你會成爲forver卡住在DO-LOOP !!!

+0

我使用標籤屬性的問題是,標籤屬性被用作圖片框中顯示內容的文本表示。我會嘗試使用name屬性代替您的建議。我會讓你知道它是怎麼回事。 –

+0

我不認爲使用名稱屬性是一個好主意,因爲它用於識別圖片框或對象。也許你可以PREFIX的圖片的文字描述,而不是forr的例子.... bob的照片... [1] bob或.....的照片,而不是在海邊... [2]通過海邊....這樣你就知道識別號碼在SQUARE括號內 – Zeddy

0

控件的順序取決於它們添加到面板的順序而不是製表索引。您可以通過仔細重新組織它們添加到表單的設計器文件中的面板的順序來更改它,但我不會推薦它。

2

作爲一個更加正確和可靠的方法,我會得到每個圖片框,保留它們的句柄和位置,然後根據它們的位置對它們進行排序。現在他們已經準備好使用了。這裏有一個例子:

Public Class Form1 
    Structure Pbox 
     Dim handle As IntPtr 
     Dim top As Integer 
     Dim left As Integer 
    End Structure 
    Dim pboxlist As New List(Of Pbox) 
    Sub ClearImages() 
     pboxlist.Clear() 
     For Each c As Control In Me.Controls 
      If TypeName(c) = "PictureBox" Then 
       Dim x As New Pbox 
       x.top = c.Top 
       x.left = c.Left 
       x.handle = c.Handle 
      End If 
     Next 
     pboxlist.OrderByDescending(Function(a) a.top).ThenByDescending(Function(a) a.left) 
     For Each item In pboxlist 
      Dim x As PictureBox = PictureBox.FromHandle(item.handle) 
      x.Image = Nothing 
     Next 
    End Sub 
End Class 

另一種方法是使用一個良好的命名,這樣就可以使用他們的名字對它們進行排序。例如,如果排序,PictureBox1將會在PictureBox2之前。所以,你應該使用PictureBox1的非常頂部和左側之一,PictureBox2的下一個等等...

編輯:使用Tag屬性,如約翰·布斯托斯的建議,而不是名稱是一種更簡單,更好的主意。因此,不要在名字中迷失方向,您可以根據您定義的標籤對圖片​​框進行排序。

+1

作爲一個附加 - 真棒答案,順便說一句,@theGD,你總是可以在'Tag'屬性中分配你的pictureboxes數字,並使用它來進行排序而不是位置,如果這樣可以更好地爲你的目的服務。 –

+0

你很對。這當然是一個更好的主意。更新我的答案... – theGD

+0

考慮到我的圖片盒實際上被命名爲PictureBox1,PictureBox2,...,...使用該名稱會更好地爲我服務。我是否還需要把它們放在一個列表中進行排序,還是有一個更快的方法? @GunDeniz –