铸造新System.Windows.Forms.Control的对象System.Windows.F

2019-07-30 02:59发布

我得到一个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的...),这将动态地添加到面板,并具有相同的基本属性(大小,位置... - >控制)

为什么不投可以吗?

Answer 1:

因为转换失败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;


Answer 2:

你控制是类的一个对象,它是父类。 可能更多的控制是从父母继承。

因此,一个孩子可以转换为家长而不是相反。

相反,使用此

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

要么

做一个文本框对象。 其中一个将永远是一个文本框,你不需要检查/铸造它。



Answer 3:

乔伊是正确的:

你的控制不是一个文本框! 您可以使用测试类型:

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;
}


Answer 4:

您的所有控件从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