1

将 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...),它们将动态添加到面板并具有相同的基本属性(大小、位置...-> 控件)

为什么不能选演员?

4

4 回答 4

6

强制转换失败,因为control 不是TextBox. 您可以将 aTextBox视为控件(类型层次结构的更高级别),但不能将任何Control视为 a 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;
于 2012-06-27T09:49:07.413 回答
1

您的控件是 Control 类的对象,它是父类。可能是更多控件从父级继承。

因此,孩子可以被视为父母,但反之则不行。

而是使用这个

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

或者

制作一个 TextBox 对象。那将永远是一个文本框,你不需要检查/转换它。

于 2012-06-27T09:50:57.373 回答
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;
}
于 2012-06-27T09:52:15.583 回答
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!
}
于 2012-06-27T09:52:32.963 回答