在将Control转换为System.Windows.Forms.Textbox时出现InvalidArgumentException:
无法将'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 ...),它们将动态添加到面板并具有相同的基本属性(Size,Location ... - > Control)
为什么演员不可能?
答案 0 :(得分: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 :(得分:1)
您可以控制Control类的一个对象,它是父类。可能是更多控件继承自父级。
因此,孩子可以作为父母而不是反过来。
改为使用此
if (control is System.Windows.Forms.TextBox)
(control as System.Windows.Forms.TextBox).Text = currentField.Name;
或
制作一个TextBox对象。那个将永远是一个TextBox,你不需要检查/转换它。
答案 2 :(得分:1)
乔伊是对的:
你的控件不是文本框!您可以使用以下方式测试类型:
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;
}
答案 3 :(得分: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!
}