2012-11-27 2 views
1

Следующий код надрез бросает InvalidCastException на петле Еогеасп:Как это бросать InvalidCastException

Невозможно привести объект типа «System.Windows.Forms.StatusStrip» до типа «System.Windows .Forms.GroupBox.

Я просто не понимаю, как это возможно .... Затем я снова нуб, поэтому его, вероятно, что-то глупое.

 private void doSlide(GroupBox MoveThis) 
    { 
     //location 12,27 
     var t = Task.Factory.StartNew(() => 
      { 
       ExecuteSecure(() => 
        { 
          foreach (GroupBox box in this.Controls) 
          { 
           if (box != MoveThis) 
           { 
            box.Left = (-1) * box.Width; 
           } 
           else 
           { 
            do 
            { 
             if (box.Left > 12) 
              box.Left--; 
             else 
              box.Left++; 
            } 
            while (box.Left != 12); 
           } 
          } 

        }); 
      }); 
    } 

Вот код для Execute Secure

private void ExecuteSecure(Action a) 
     { 
      if (InvokeRequired) 
       BeginInvoke(a); 
      else a(); 
     } 

В основном у меня есть форма с фиксированным размером и несколько коробок групп на форме, только один из которых виден в любой заданной точке. Когда нам нужно сделать новую видимость GroupBox, мы вызываем DoSlide (GroupBox) и указываем групповой ящик, который мы хотим сделать видимым. Затем предполагается, что каждый GroupBox переместит форму в местоположение (-Box.Width, 27), за исключением указанной формы, которая получает слайд (увеличенный или уменьшенный box.left) в представлении.

+0

Можете ли вы опубликовать трассировку стека? –

+1

Все элементы в 'this.Controls' типа' GroupBox' (или их подкласса)? –

ответ

11

Вы хотите использовать

this.Controls.OfType<GroupBox>() 

в вашем Еогеасп. This.Controls возвращает все элементы управления, а не только GroupBoxes. Метод расширения OfType<T> фильтрует коллекцию по указанному типу.

+0

В основном, this.Controls содержит больше, чем просто GroupBoxes, поэтому вам нужно указать только групповые группы – jle

+0

Bingo, у нас была эта же проблема в [другом вопросе] (http://stackoverflow.com/questions/13589008/unable-to- cast-object-while-looping-through-programatically-created-textboxes /) не 4 часа назад. :) – tmesser

+0

Я не могу принять ответ достаточно быстро! - Спасибо за тонкую реакцию. Если бы это было решено менее чем за 2 минуты. – Wjdavis5

4

Когда вы Переберите каждый элемент управления, вы должны быть определяющим типа управления, а не только при условии, что все они GroupBox объектов

2

Коллекция this.Controls содержит все ваши формы управления первого уровня, так что не каждый контроль внутри является GroupBox. Вы должны получить только GroupBox управления

Изменение цикла, используя следующий синтаксис

foreach (GroupBox box in this.Controls.OfType<GroupBox>()) 
{ 
    .... 
} 
2

Не каждый элемент управления в Controls коллекции является GroupBox (очевидно), но foreach пытается бросить их в линию.

Таким образом, изменить свою петлю на что-то вроде этого:

foreach (var control in this.Controls) 
{ 
    if(control is GroupBox) 
    { 
     if (control != MoveThis) 
     { 
      control.Left = (-1) * control.Width; 
     } 
     else 
     { 
      do 
      { 
       if (control.Left > 12) 
        control.Left--; 
       else 
        control.Left++; 
      } 
      while (control.Left != 12); 
     } 
    } 
} 

EDIT: Стоит отметить, что это потенциально может быть очень медленным, так как вы оценить тип каждого элемента управления в форме. Код, который предлагает Джон Крафт и Стив, должен фильтровать коллекцию управления только теми, которые являются GroupBox, так что это, вероятно, даст лучшую производительность ...

+0

Я сомневаюсь, что другой код работает быстрее.'OfType ()' должен проверять каждый элемент, независимо от того, является ли он также «GroupBox». –

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