2016-05-23 2 views
2

Я пытаюсь проверить кучу элементов управления в GroupBox в приложении на основе формы.Невозможно применить объект Type1 к типу Type2?

Я не могу представить карту ComboBox приложению, чтобы он распознавал и генерировал ошибку, и это делается только для TextBox.

private void groupBox1_Validating(object sender, CancelEventArgs e) 
{ 
    foreach (Control control in groupBox1.Controls) 
    { 
     string controlType = control.GetType().ToString(); 
     var lst = new List<string>() { "System.Windows.Forms.TextBox" ,"System.Windows.Forms.ComboBox"}; 

     //if (controlType == "System.Windows.Forms.TextBox") 
     if (lst.Contains(controlType, StringComparer.OrdinalIgnoreCase)) 
     { 
      TextBox txtBox = (TextBox)control; 
      ComboBox combo = (ComboBox)control; 
      if (string.IsNullOrEmpty(txtBox.Text) && string.IsNullOrEmpty(combo.Text)) 
      { 
       MessageBox.Show(txtBox.Name + " Can not be empty"); 
      } 
     } 
    } 
} 

Здесь ошибка я получаю:

Невозможно привести объект 'System.Windows.Forms.ComboBox' типа к типу 'System.Windows.Forms.TextBox'.

+2

Ну, выпадающий * не * текстовое поле, что вы пытаетесь достичь здесь? –

+3

Вы относитесь к 'as', который будет оценивать до« null », если он не может быть отброшен? 'TextBox txtBox = управление как TextBox;'? –

+1

Кроме того, почему бы просто не пойти на 'control.Text'? –

ответ

2

Поскольку вы просто хотите, чтобы проверить свойство Text и Name и потому, что оба TextBox и ComboBox наследует от Control класса вы не нужно бросать сюда. Это должно работает для вас:

foreach (Control control in groupBox1.Controls) 
{ 
    if (!lst.Contains(control.GetType().ToString(), StringComparer.OrdinalIgnoreCase)) continue; 
    if (string.IsNullOrEmpty(control.Text) && string.IsNullOrEmpty(control.Text)) 
    { 
     MessageBox.Show(control.Name + " Can not be empty"); 
    } 
} 

Или с Linq:

foreach (Control control in from Control control in groupBox1.Controls 
            where lst.Contains(control.GetType().ToString(), StringComparer.OrdinalIgnoreCase) 
            where string.IsNullOrEmpty(control.Text) && string.IsNullOrEmpty(control.Text) 
            select control) 
{ 
    MessageBox.Show(control.Name + " Can not be empty"); 
} 
+0

Проблема в том, что у группы grupbox могут быть другие вещи, кроме текстовых полей и комбо, которые не нужно проверять – Aimnox

+1

@Aimnox ... И тогда OP мог проверить для этого следующим образом: 'if (lst.Contains (control.GetType(). ToString(), StringComparer.OrdinalIgnoreCase))' –

2

Используйте оператор is, чтобы проверить, есть ли у вас правильный тип:

if(control is TextBox) 
{ 
    TextBox txtBox = (TextBox)control; 

    // Do something with txtBox 
    if (string.IsNullOrEmpty(txtBox.Text)) 
    { 
     MessageBox.Show(txtBox.Name + " Can not be empty"); 
    } 
} 

if(control is ComboBox) 
{ 
    ComboBox combo = (ComboBox)control; 

    // Do something with combo 
    if (string.IsNullOrEmpty(combo.Text)) 
    { 
     MessageBox.Show(combo.Name + " Can not be empty"); 
    } 
} 
3

Давайте подведем итог, что вы хотите сделать:

  1. Для каждого элемента управления внутри groupBox1
  2. .. типа TextBox или ComboBox
  3. Подтвердите, что элемент управления не пуст, если это так, sho ва окно сообщения

Вот некоторые важные моменты:

  1. Каждый элемент управления, который наследует от Control имеет публичный Text собственности, вы действительно не нужно знать, если это текстовое поле или выпадающий для этого часть
  2. Элемент управления не является как текстовое поле и выпадающий (то есть, ни один класс управления не наследует от обоих TextBox и ComboBox), так что один из этих слепков потерпит неудачу каждый раз, когда
  3. Вы можете использовать as вместо жесткого гипса, который будет возвращать null в слепке броском, который не может быть сделан, но с точкой 1. выше это не является необходимым

Так вот переписан код с выше знания:

private void groupBox1_Validating(object sender, CancelEventArgs e) 
{ 
    foreach (Control control in groupBox1.Controls) 
    { 
     if (!(control is TextBox || control is ComboBox)) 
      continue; 
     if (!string.IsNullOrEmpty(control.Text)) 
      continue; 
     MessageBox.Show(control.Name + " Can not be empty"); 
    } 
} 

Обратите внимание, что если вы хотите, чтобы делать другие вещи, а также, что бы нужно знать, если элемент управления является текстовое поле или выпадающий, я бы вместо того, чтобы переписать его следующим образом:

private void groupBox1_Validating(object sender, CancelEventArgs e) 
{ 
    foreach (Control control in groupBox1.Controls) 
    { 
     var textbox = control as TextBox; 
     if (textbox != null) 
     { 
      ... do your processing of textboxes here 
      continue; 
     } 
     var combobox = control as ComboBox; 
     if (combobox != null) 
     { 
      ... do your processing of comboboxes here 
      continue; 
     } 
     ... do your processing of other controls here 
    } 
} 
+0

Неверный условный оператор. Должно быть '||' не 'или'. – Ulric

+0

Спасибо, это то, что я получаю от сидения в SQL все утро :) –

1

Как заметил @ LasseV.Karlsen, я брал длинный маршрут, добавляя индивидуально в каждый элемент управления. Я просто добавил контроль вместо чего-то, а не конкретных элементов управления.

Вот что мой обновленный код выглядит сейчас:

foreach (Control control in groupBox1.Controls) 
     { 
      string controlType = control.GetType().ToString(); 
      var lst = new List<string>() { "System.Windows.Forms.TextBox" ,"System.Windows.Forms.ComboBox"}; 

      //if (controlType == "System.Windows.Forms.TextBox") 
      if (lst.Contains(controlType, StringComparer.OrdinalIgnoreCase)) 
      { 
       // TextBox txtBox = (TextBox)control; 
       // ComboBox combo = (ComboBox)control; 
       if (string.IsNullOrEmpty(control.Text) && string.IsNullOrEmpty(control.Text)) 
       { 
        MessageBox.Show(control.Name + " Can not be empty"); 
       } 
      } 
3

В своем коде, он бросил любое текстовое поле и любое комбо в текстовое поле и комбо.

Необходимо наложить его только на то, что он есть.

private void groupBox1_Validating(object sender, CancelEventArgs e) 
{ 
    foreach (Control control in groupBox1.Controls) 
    { 
     if (control is ComboBox) 
     { 
      ComboBox combo = (ComboBox)control; 
      if (string.IsNullOrEmpty(combo.Text)) MessageBox.Show(combo.Name + " Can not be empty"); 
     } 
     else if (control is TextBox) 
     { 
      TextBox txtBox = (TextBox)control; 
      if (string.IsNullOrEmpty(txtBox.Text)) MessageBox.Show(txtBox.Name + " Can not be empty"); 
     } 
    } 
} 

Если GroupBox только текстовое поле и выпадающий вы также можете сделать:

private void groupBox1_Validating(object sender, CancelEventArgs e) 
{ 
    foreach (dynamic control in groupBox1.Controls) 
    {    
     if (string.IsNullOrEmpty(control.Text)) MessageBox.Show(control.Name + " Can not be empty");    
    } 
}