DOBON.NETプログラミング道掲示板

No35164 の記事


■35164 / )  Re[3]: TEXTBOXのプロパティを文字列に
□投稿者/ 魔界の仮面弁士 大御所(1453回)-(2022/10/11(Tue) 19:04:19)
  • アイコンNo35163に返信(ま〜さんの記事)
    > TextBox2.BackColor = DirectCast(pdBackColor.Converter.ConvertFromInvariantString(Label14.Text), BackColor)
    > TextBox2.ForeColor = DirectCast(pdForeColor.Converter.ConvertFromInvariantString(Label15.Text), ForeColor)
    DirectCast の第二引数には「データ型」を指定します。

    BackColor プロパティは「System.Drawing.Color 型」で
    ForeColor プロパティも「System.Drawing.Color 型」で
    Font プロパティは「System.Drawing.Font 型」で
    Text プロパティは「System.String 型」で
    Enabled プロパティは「System.Boolean 型」ですよね。

    すなわち、
     TextBox1.BackColor = DirectCast(〜, Color)
     TextBox1.ForeColor = DirectCast(〜, Color)
     TextBox1.Font = DirectCast(〜, Font)
     TextBox1.Text = DirectCast(〜, String)
     TextBox1.Enabled = DirectCast(〜, Boolean)
    のように記述することになります。



    > (Label13は適当に書いてみました。これが要因?)
    Label 用の PropertyDescriptor を TextBox 用に対して用いてはいけません。

    PropertyDescriptor にとって重要なのは「どの型のプロパティを扱おうとしているのか」なので、
    コントロールの型を一致させてないと実行時エラーになりえます。


    たとえば
     Dim a = TypeDescriptor.GetProperties(Label1).Find("AutoEllipsis", False)
     Dim b = TypeDescriptor.GetProperties(TextBox1).Find("CharacterCasing", False)
    とした場合、
     MsgBox( a.GetValue(Label1) )
     MsgBox( b.GetValue(TextBox1) )
    とは書けますが、
     MsgBox( a.GetValue(TextBox1) )
     MsgBox( b.GetValue(Label1) )
    にしてしまうと、呼び出し時に例外がスローされます。
    これは ShouldSerializeValue などでも同じことです。


    PropertyDescriptor は:

    Dim pd As PropertyDescriptor = TypeDescriptor.GetProperties(Label1).Find("Font", False)
    のように「コントロールのインスタンス」を通じて取得する方法のほか、

    Dim pd As PropertyDescriptor = TypeDescriptor.GetProperties(GetType(Label)).Find("Font", False)
    のように「コントロールの型」を通じて取得する方法もあります。
違反を報告
返信 削除キー/


Mode/  Pass/


- Child Tree -