我得到一个InvalidArgumentException同时播送控制到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;
我这样做,因为我有不同的控件(文本框,MaskedTextBox中,dateTimePicker的...),这将动态地添加到面板,并具有相同的基本属性(大小,位置... - >控制)
为什么不投可以吗?
因为转换失败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;
你控制是类的一个对象,它是父类。 可能更多的控制是从父母继承。
因此,一个孩子可以转换为家长而不是相反。
相反,使用此
if (control is System.Windows.Forms.TextBox)
(control as System.Windows.Forms.TextBox).Text = currentField.Name;
要么
做一个文本框对象。 其中一个将永远是一个文本框,你不需要检查/铸造它。
乔伊是正确的:
你的控制不是一个文本框! 您可以使用测试类型:
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;
}
您的所有控件从Control继承。 但是,一个TextBox是不一样的DateTimePicker,例如,所以你不能将它们转换成对方,只向父类型。 这是有道理的,因为每个控制是专门做某些任务。
既然你有不同类型的控件,您不妨先测试类型:
if(control is System.Windows.Forms.TextBox)
{
((System.Windows.Forms.TextBox)control).Text = currentField.Name;
}
您也可以推测使用“转换为类型为 ”关键字:
TextBox isThisReallyATextBox = control as TextBox;
if(isThisReallATextBox != null)
{
//it is really a textbox!
}
文章来源: casting new System.Windows.Forms.Control object to System.Windows.Forms.Textbox