2013-05-13 60 views
1

在一個類從一個Panel控制移動到另一個VB.NET,這似乎很簡單寫了一個快速的子程序:VB.NET遍歷一個面板控件跳過控制

Public Sub Move(ByRef OldPanel As System.Windows.Forms.Panel) 
    Dim panelControl As System.Windows.Forms.Control 
    For Each panelControl In OldPanel.Controls 
     MessageBox.Show(panelControl.Name) 'Debugging 
     OldPanel.Controls.Remove(panelControl) 'Fairly certain this line makes no difference 
     NewPanel.Controls.Add(panelControl) 
    Next 
End Sub 

的問題是,它只會移動大約一半的控件。其他面板完全沒有被迴路拾取,並且仍然綁定到OldPanel。我已經證實,這些控件絕對是OldPanel的一部分(不僅僅是可視化地浮在上面)。

例如,如果面板上有6個控件,則MessageBox.Show(panelControl.Name)只反饋3個控件,只有這3個控件移動。這是......莫名其妙。

我寫的窗體類_Load事件本身內部類似調試循環,這正確拿起所有6個控制面板上:

Dim panelControl As System.Windows.Forms.Control 
For Each panelControl In Me.Panel1.Controls 
    MessageBox.Show(panelControl.name) 
Next 

任何想法?

+1

您正在更改集合,同時循環播放它;那是在尋求麻煩。 – 2013-05-13 11:51:07

+0

啊哈,很好。實際上可能就是這樣。 – Kai 2013-05-13 11:53:46

回答

1

您正在更改集合,同時使用每個循環來遍歷它;那就是在尋找麻煩:一旦開始使用foreach並獲得了枚舉數據,那麼統計數據就像在開始時一樣被綁定到集合上。

解決此問題的一種方法是先循環並收集要刪除的控件列表。

然後循環列表並刪除這些控件。

另一種方法是使用for,它不創建枚舉器。

請注意,如果控件嵌套在另一個控件中,您的代碼將不起作用。

+0

排序,歡呼聲。我會在5分鐘內回答。你可以擴展「如果一個控件嵌套在另一個控件中,你的代碼將無法工作」?不會移動'父母'控制也會讓孩子移動嗎? – Kai 2013-05-13 12:01:05

+0

是的,但是如果你不想移動父控件想要移動一個子控件,你將不得不循環到每個控件的子控件。那有意義嗎? – 2013-05-13 12:07:11

+0

啊,我明白了。這超出了這個函數的範圍(它應該只是移動所有東西),但是很高興知道,謝謝。 – Kai 2013-05-13 12:16:21

3

這種類型的問題的一種常見解決方案是在集合上向迴環。然後,當您刪除項目時,它不會影響您尚未看到的項目的索引:

Public Class Form1 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     MoveControls(Panel1, Panel2) 
    End Sub 

    Public Sub MoveControls(ByVal OldPanel As Panel, ByVal NewPanel As Panel) 
     Dim ctlCount As Integer = OldPanel.Controls.Count - 1 
     For i As Integer = ctlCount To 0 Step -1 
      NewPanel.Controls.Add(OldPanel.Controls(i)) 
     Next 
    End Sub 

End Class