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ため、キャストは失敗します。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;
于 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オブジェクトを作成します。これは常に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 に答える