ボタンコントロールを配列にするには?

解決


なまぐり  2007-06-07 22:05:07  No: 143598

いつもお世話になっております。

誤って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の設定が足りないのでしょうか?

どなたかご教授お願いします。


大吉末吉  2007-06-07 22:22:23  No: 143599

> typ.GetProperty
これって、「コントロール」を参照しているじゃないですよね?
単純に「プロパティ」の参照をやっているんですよね?

#「コントロール」と「プロパティ」は違いますよね?
#IDE上で、デザイン時に配置されたコントロールは、
#IDEがサービス(?)で、プロパティにしてくれますが・・・

そもそも、プロパティはコンパイル時に決まるので、実行時に追加なんかできないですよね?

こんな面倒なことしないで、単純に
> ユーザコントロール内でボタンを生成
したタイミングで、
> ctrs.Add
すればよいのでは?

つまり・・・
>   ・ユーザコントロール画面にボタンを1つ保持  (Name=Button1)
>   ・ユーザコントロール内のボタンを配列化する
  ==>このタイミングではデザイン時の分だけで我慢
>   ・フォームからの呼び出し時にボタンを3つ表示するため、
>     ユーザコントロール内でボタンを生成
>     (Name=Button2、Button3)
  ==>ここで、追加分を登録
とか・・・


なまぐり  2007-06-08 00:48:10  No: 143600

大吉末吉さん、回答ありがとうございます。

実はここに掲示後、私もいっそのことベタで設定してしまおうかと
いろいろ試していましたら、ご教授いただいたような方法で、
ボタン配列を設定、フォームへの表示が確認できました。

> そもそも、プロパティはコンパイル時に決まるので、実行時に追加なんかできないですよね?
これに関しては全く気づきませんでした。

大変参考になりました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加