2016-09-20 6 views
4

Я выполняю некоторые функции проверки для моего проекта, но я что-то застрял. Я хочу иметь одну функцию для обработки нескольких различных элементов управления и ошибок.
Вот мой код:Получить c.SelectedItem в элементах управления C#

private void ValidateControls(Control c) 
{ 
    if (c is TextBox) 
    { 
     if (c.Text == "") 
     { 
      epNew.SetError(c, "Something"); 
     } 
    } 
    else if (c is ComboBox) 
    { 
     // What now? 
     // if (c.SelectedItem == null) does not work 
    } 

} 

И я называю это так:

private void txtNEAN_Validating(object sender, CancelEventArgs e) 
{ 
    ValidateControls(txtNEAN); 
} 

Это прекрасно работает для текстовых полей. Но если я делаю:

private void cbbEMerk_Validating(object sender, CancelEventArgs e) 
{ 
    ValidateControls(cbbEMerk); 
} 

if (c.SelectedItem == null), например, не работает.
Как я могу это достичь? И это нормально использовать? Если нет, то какая альтернатива лучше?
Хотелось бы услышать что угодно!

ответ

6

Вы должны бросить c к ComboBox в этом случае

else if (c is ComboBox) 
    { 
     if (((ComboBox)c).SelectedItem == null) 
    } 

Кстати, не создать метод _Validating для каждого элемента управления, если они делают то же самое. Вы можете использовать одну, или один txtBox_Validating для TextBoxes, один comboBox_Validating для Наримера и т.д.

+0

Спасибо за предложения и ответ! Я помету это, как только смогу. – Sj03rs

+1

Вы также можете прочитать https://msdn.microsoft.com/en-us/library/ms950965.aspx (не уверен, что вы работаете с WinForms, но в любом случае) –

+0

Кроме того, вам не нужно бросать его, как 'if (((ComboBox) c) .SelectedItem == null)'? В противном случае это даст мне ошибку, которую ComboBox не может использовать в качестве метода. – Sj03rs

2

Попробуйте использовать

((ComboBox)c).SelectedItem 

вместо этого. Это говорит программе, чтобы проанализировать элемент управления c в ComboBox.

В качестве альтернативы, вместо использования is вы могли бы использовать as

// Converts c to a ComboBox. If c is not a ComboBox, assigns null to cmbControl 

ComboBox cmbControl = c as ComboBox; 
if (cmbControl != null) 
{ 
    if (cmbControl.SelectedItem != null) 
    { 
     // Do stuff here 
    } 
} 
// Else it's not a ComboBox 
1

Это также хорошо знать о безопасности актеров, используя в качестве и:

Поскольку объекты являются полиморфными, это возможно, для переменной типа базового класса для хранения производного типа. Чтобы получить доступ к методу производного типа, необходимо вернуть значение обратно к производному типу. Тем не менее, попытка простого приведения в этих случаях создает риск выброса исключения InvalidCastException. Вот почему C# предоставляет операторы is и as. Вы можете использовать эти операторы для проверки того, будет ли приведение выполнено, не вызывая исключения. В общем случае оператор as более эффективен, так как он фактически возвращает значение отливки, если литье может быть выполнено успешно. Оператор is возвращает только логическое значение. Поэтому его можно использовать, когда вы просто хотите определить тип объекта, но не должны его бросать.


Вы можете увидеть больше here