2014-02-06 4 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 as Panel». Кто-нибудь видит, что может пойти не так?

ответ

7

Потому что у вас есть кнопка в коллекции элементов управления TabPage.

Попробуйте ее фильтрации:

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

Next 
3

Перечисление не работает, как вы подозреваете. Эта линия:

For Each p As Panel In t.Controls 

Не фильтровать элементы управления с помощью только объектов панели, он возвращает все элементы управления и пытается заставить их тип Panel - которая потерпит неудачу, как только это найти элемент управления, который не является панель

Вам нужно всего лишь дополнительная проверка, чтобы убедиться, что управление представляет собой панель

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

Смежные вопросы