2014-02-06 39 views
2

我有以下代碼:VB.NET對於每個列舉錯誤

For Each t As TabPage In Me.TabControl1.TabPages 
     For Each p As Panel In t.Controls 
      Dim sText As String = p.Name 
      If modStrings.Has(sText, u) Then 
       m_PrevPanel = p 
       p.Parent = Me.pnlMain 
       Return 
      End If 
     Next 
    Next 

但有時在線路

For Each p as Panel in t.Controls 

我得到錯誤

「的類型SystemWindows的目的.Forms.Button不能轉換爲System.Windows.Forms.Panel「。

我不明白爲什麼它會嘗試在「p作爲面板」枚舉中包含一個按鈕。 有人看到這裏可能會出現什麼問題嗎?

回答

7

因爲您在TabPage控件集合上有一個按鈕。

嘗試對其進行篩選:

For Each p As Panel In t.Controls.OfType(Of Panel)() 

Next 
3

枚舉不工作,你會懷疑。這條線:

For Each p As Panel In t.Controls 

不僅由面板對象過濾控制,它返回的所有控件,並試圖強迫他們小組類型 - 因爲它找到一個控制是不是這就會失敗面板

你只是需要一個額外的檢查,以確保控制面板

For Each ctl As Control In Me.Controls 
     If ctl.GetType() Is GetType(Panel) Then 
      Dim p As Panel = CType(ctl, Panel) 

     End If 
    Next 

這將是很好,如果編譯器就撿起說實話,因爲它可以是一個常見的運行時錯誤

+0

在循環上過濾而不是枚舉每一個並檢查類型會更快嗎? – webnoob

+0

*速度*可能會忽略不計,但我認爲更有效率*做到這一點是 –

+0

對不起,選擇不當的話,我的意思是說效率。 – webnoob