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

Controls.addはnetで変わりましたか

環境/言語:[使用言語:VB.net,VB6]
分類:[.NET]

すみません。教えてください。
おそらく内容を噛み砕くと既出なのかもしれませんが
VB6では (例)Controls.Add("VB.TextBox","Text1")のような記述ができましたが、
VB.netでは、このような記述はやはりできませんか。
いわゆる上記ようなのStringで指定する方法は、厳密な型宣言で不可になってしまったのでしょうか。
VB6のロジック内で独自に作成した多数のユーザコントロールを、表示する状況に応じて変更できるように指定していたので、結構落ち込んでいます。

netで実現できそうなテクニックがあったら教えてください。

宜しくお願い致します。
どらごらです。

■No3368に返信(deadendさんの記事)
> VB6では (例)Controls.Add("VB.TextBox","Text1")のような記述ができましたが、
> VB.netでは、このような記述はやはりできませんか。

        Dim I As Integer
        Dim tmpBtn As Button

        For I = 0 To 3
            tmpBtn = New Button
            tmpBtn.Name = "Button" & CStr(I)
            tmpBtn.Text = tmpBtn.Name
            tmpBtn.SetBounds(10, 23 * I, 75, 23)
            Me.Controls.Add(tmpBtn)
        Next

こんなのはどうでしょう?
どらごらさん、大幅に遅レスしてごめんなさい。
もう少し教えてください。

■No3369に返信(どらごらさんの記事)
> どらごらです。
>
> ■No3368に返信(deadendさんの記事)
>>VB6では (例)Controls.Add("VB.TextBox","Text1")のような記述ができましたが、
>>VB.netでは、このような記述はやはりできませんか。
>
> Dim I As Integer
> Dim tmpBtn As Button
>
> For I = 0 To 3
> tmpBtn = New Button
> tmpBtn.Name = "Button" & CStr(I)
> tmpBtn.Text = tmpBtn.Name
> tmpBtn.SetBounds(10, 23 * I, 75, 23)
> Me.Controls.Add(tmpBtn)
> Next
>
> こんなのはどうでしょう?

VB6.0のときは、
Me.Controls.Add("クラス名(独自に作ったものも含む)","コントロール名")
の記述が可能だったので、コントロールを追加時に自由に設定できていましたが
NETから、このような記述ができなくなってしまいました。

ここのtmpBtn = New Buttonのところなんですが
  Dim tmpBtn as Control
として、
tmpBtn = new …("クラス","コントロール")となるような記述ができるか
お分かりでしたら、お教えください。
もしくは、別の方法がいあれば、お教えくださればと思います。

おいそがしいなか、ご返答ありがとうございます。
> VB6.0のときは、
> Me.Controls.Add("クラス名(独自に作ったものも含む)","コントロール名")
> の記述が可能だったので、コントロールを追加時に自由に設定できていましたが
> NETから、このような記述ができなくなってしまいました。
>
> ここのtmpBtn = New Buttonのところなんですが
>   Dim tmpBtn as Control
> として、
> tmpBtn = new …("クラス","コントロール")となるような記述ができるか
> お分かりでしたら、お教えください。
> もしくは、別の方法がいあれば、お教えくださればと思います。

そういう記述はできませんので、リフレクションを使ってインスタンス生成することになります。
ActivatorクラスのCreateInstanceメソッドを調べてみてください。
よねKENさん。ありがとうございます。

> そういう記述はできませんので、リフレクションを使ってインスタンス生成することになります。
> ActivatorクラスのCreateInstanceメソッドを調べてみてください。
実現にこの時間までかかってしまって...
いいアドバイスありがとうございます。
以下の方法で実現しました。
Dim asm As System.Reflection.Assembly
Dim wInstance as Control
asm = System.Reflection.Assembly.LoadFrom("コントロールのあるDLL名")
wInstance = asm.CreateInstance("プロジェクト名.コントロール名")
これで
Control.Add(wInstance)
でいけそうな気がします。ありがとうございました。
最終的に行き着いた記事(Basic英語)
http://support.microsoft.com/default.aspx?scid=kb;EN-US;311321
参考C#の場合(日本語)
http://support.microsoft.com/default.aspx?scid=kb;ja;815780

きわめて貴重なアドバイスありがとうございました。
deadend改めかつどん拝
解決済み!

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