いつもお世話になっております。
誤ってVB2〜VB6の方に掲示してしまっていました。
本質問は.NET(VB2005)に関してでしたので、こちらで再度
掲示させていただいています。。。
以下、質問内容になります。
ユーザコントロールに設定しているボタンを配列化させたいのですが
うまくいきません。
実際には、
・ユーザコントロール画面にボタンを1つ保持 (Name=Button1)
・フォームからの呼び出し時にボタンを3つ表示するため、
ユーザコントロール内でボタンを生成
(Name=Button2、Button3)
・ユーザコントロール内のボタンを配列化する
Dim typ As System.Type = form.GetType()
Dim pi As System.Reflection.PropertyInfo
Dim ctrs As New System.Collections.ArrayList
Dim i As Integer = 1
While True
pi = typ.GetProperty(name + i.ToString(), _
System.Reflection.BindingFlags.Public Or _
System.Reflection.BindingFlags.NonPublic Or _
System.Reflection.BindingFlags.Instance Or _
System.Reflection.BindingFlags.DeclaredOnly)
i += 1
If pi Is Nothing Then
Exit While
Else
ctrs.Add(pi.GetValue(form, Nothing))
End If
End While
If ctrs.Count = 0 Then
Return Nothing
Else
Return ctrs.ToArray(ctrs(0).GetType())
End If
ここで、元々フォームに貼り付けていたボタンについては
配列に設定できたのですが、プログラムで生成したボタンは
上記pi=Nothingとなってしまい設定できませんでした。
BindingFlagsの設定が足りないのでしょうか?
どなたかご教授お願いします。
> typ.GetProperty
これって、「コントロール」を参照しているじゃないですよね?
単純に「プロパティ」の参照をやっているんですよね?
#「コントロール」と「プロパティ」は違いますよね?
#IDE上で、デザイン時に配置されたコントロールは、
#IDEがサービス(?)で、プロパティにしてくれますが・・・
そもそも、プロパティはコンパイル時に決まるので、実行時に追加なんかできないですよね?
こんな面倒なことしないで、単純に
> ユーザコントロール内でボタンを生成
したタイミングで、
> ctrs.Add
すればよいのでは?
つまり・・・
> ・ユーザコントロール画面にボタンを1つ保持 (Name=Button1)
> ・ユーザコントロール内のボタンを配列化する
==>このタイミングではデザイン時の分だけで我慢
> ・フォームからの呼び出し時にボタンを3つ表示するため、
> ユーザコントロール内でボタンを生成
> (Name=Button2、Button3)
==>ここで、追加分を登録
とか・・・
大吉末吉さん、回答ありがとうございます。
実はここに掲示後、私もいっそのことベタで設定してしまおうかと
いろいろ試していましたら、ご教授いただいたような方法で、
ボタン配列を設定、フォームへの表示が確認できました。
> そもそも、プロパティはコンパイル時に決まるので、実行時に追加なんかできないですよね?
これに関しては全く気づきませんでした。
大変参考になりました。
ありがとうございました。
ツイート | ![]() |