2012-06-27 3 views
0

я получаю InvalidArgumentException во время литья управления для System.Windows.Forms.Textbox:литье нового объекта System.Windows.Forms.Control к System.Windows.Forms.Textbox

Невозможно привести объект типа ' System.Windows.Forms.Control 'для ввода' System.Windows.Forms.TextBox '.

System.Windows.Forms.Control control = new System.Windows.Forms.Control(); 
control.Width = currentField.Width; 

//here comes the error 
((System.Windows.Forms.TextBox)control).Text = currentField.Name; 

Я делаю это, потому что у меня есть различные элементы управления (TextBox, MaskedTextBox, DateTimePicker ...), которые будут динамически добавляться к панели и имеют те же основные свойства (размер, расположение .. . -> Контроль)

Почему это не возможно?

ответ

5

Лист не действует, потому что controlне является TextBox. Вы можете обрабатывать TextBox как элемент управления (выше иерархии типов), но не Control как TextBox. Для установления общих свойств вы можете рассматривать все как Control и установить их в то время как вы должны создать фактические элементы управления, которые вы хотите использовать заранее:

TextBox tb = new TextBox(); 
tb.Text = currentField.Name; 

Control c = (Control)tb; // this works because every TextBox is also a Control 
         // but not every Control is a TextBox, especially not 
         // if you *explicitly* make it *not* a TextBox 
c.Width = currentField.Width; 
1

You управление является объектом класса управления, который является родительским классом. Может быть больше элементов управления наследуется от родителя.

Следовательно, ребенок может быть отлит как родительский, а не наоборот.

Вместо этого используйте этот

if (control is System.Windows.Forms.TextBox) 
    (control as System.Windows.Forms.TextBox).Text = currentField.Name; 

или

Сделать объект TextBox. Это всегда будет TextBox, и вам не нужна проверка/кастинг для него.

1

Joey is right:

Ваш контроль не является текстовым полем! Вы можете тестировать типы, используя:

System.Windows.Forms.Control control = new System.Windows.Forms.Control(); 
control.Width = currentField.Width; 

if (control is TextBox) 
{ 
//here comes the error 
((System.Windows.Forms.TextBox)control).Text = currentField.Name; 
} 
1

Все ваши элементы управления наследуются от System.Windows.Forms.Control. Тем не менее, TextBox - это не то же самое, что и DateTimePicker, поэтому вы не можете передавать их друг другу, только родительским типам. Это имеет смысл, поскольку каждый элемент управления специализирован для выполнения определенных задач.

Учитывая, что у вас есть контроль различных типов, вы можете проверить тип первым:

if(control is System.Windows.Forms.TextBox) 
{ 
((System.Windows.Forms.TextBox)control).Text = currentField.Name; 
} 

Вы можете также умозрительно приведение к типу с помощью «as» ключевого слова:

TextBox isThisReallyATextBox = control as TextBox; 

if(isThisReallATextBox != null) 
{ 
    //it is really a textbox! 
} 
Смежные вопросы