将新的System.Windows.Forms.Control对象转换为System.Windows.Forms.Textbox

时间:2012-06-27 09:47:03

标签: c# winforms casting textbox controls

在将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)

为什么演员不可能?

4 个答案:

答案 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!
}