- PR -

【VB.NET】Form上のコントロール一覧を取得する方法

投稿者投稿内容
masima
会議室デビュー日: 2003/08/05
投稿数: 7
投稿日時: 2003-08-05 16:17
はじめまして。
現在VB.NETでプログラムを作成中なのですが、その中で件名のとおり、
「Form上のコントロール一覧を取得する」という処理が必要になりました。
まず、Me.Controlsを参照してみたのですが、GroupBoxなどコンテナ上の
コントロールを取得できなかったため、以下のプログラムを作成しました。
------------------------------------------------------------
Private r As New Collection

Public Sub ControlList(ByVal f As ControlCollection)
Dim c As Control

For Each c In f
If c.Controls.Count = 0 Then
r.Add(c)
Else
Call ControlList(c.Controls)
End If
Next
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim c As Control

Call ControlList(Me.Controls)
For Each c In r
MsgBox(c.Name)
Next
End Sub
------------------------------------------------------------
しかしこのプログラムを実行したところ、ControlListを再帰呼び出し
している個所で「指定されたキャストは有効ではありません」という
エラーになってしまいました。
引数の型はControlCollectionになっているはずなのですが・・・。
どなたか解決策をご存知の方いらっしゃいましたらご教授お願いいたします。
また、上記以外の方法でForm上のコントロール一覧を取得する方法を
ご存知でしたら教えて下さい。
mito
ベテラン
会議室デビュー日: 2002/05/17
投稿数: 50
投稿日時: 2003-08-05 17:55
全然詳しくはないのです間違っていたらごめんなさい。
ControlCollectionは4つ存在(Form、Control、Web、MDIClient)していて、何も指定しないとFormになるみたいです。
なのでControl.ControlCollectionはForm.ControlCollectionにキャストできないのでエラーが発生していると思われます。
対応ですが、
Public Sub ControlList(ByVal f As ControlCollection)

Public Sub ControlList(ByVal f As Object)
にするぐらいしか思いつきません。たぶんちゃんとした方法があると思うのですが・・・
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-08-05 18:03
引用:

mitoさんの書き込み (2003-08-05 17:55) より:
全然詳しくはないのです間違っていたらごめんなさい。
ControlCollectionは4つ存在(Form、Control、Web、MDIClient)していて、何も指定しないとFormになるみたいです。
なのでControl.ControlCollectionはForm.ControlCollectionにキャストできないのでエラーが発生していると思われます。
対応ですが、
Public Sub ControlList(ByVal f As ControlCollection)

Public Sub ControlList(ByVal f As Object)
にするぐらいしか思いつきません。たぶんちゃんとした方法があると思うのですが・・・


Control.ControlCollectionでないといけないのなら
Public Sub ControlList(ByVal f As Control.ControlCollection)
とすればよいと思うんですけど、なんか勘違いしてますかね?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-08-05 18:08
引用:

mitoさんの書き込み (2003-08-05 17:55) より:
ControlCollectionは4つ存在(Form、Control、Web、MDIClient)していて、何も指定しないとFormになるみたいです。


何も指定しないとForm.ControlCollectionになるのは、Form内で記述しているからです。
# 実際には継承したメンバですが…
mito
ベテラン
会議室デビュー日: 2002/05/17
投稿数: 50
投稿日時: 2003-08-05 18:21
Call ControlList(Me.Controls)
ここでForm.ControlCollectionを引数に使っていて、
Call ControlList(c.Controls)
ここでControl.ControlCollectionを引数に渡しているので
どちらかを指定するとどちらかでエラーが起こると思ったのです。
どちらも使いたい場合はどう指定すればいいのか・・・

>何も指定しないとForm.ControlCollectionになるのは、Form内で記述しているからです。
なるほど!
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-08-05 18:33
引用:

mitoさんの書き込み (2003-08-05 18:21) より:
Call ControlList(Me.Controls)
ここでForm.ControlCollectionを引数に使っていて、
Call ControlList(c.Controls)
ここでControl.ControlCollectionを引数に渡しているので


Me.Controlsの型は、本当にForm.ControlCollectionでしょうか?
そう思い込んでしまっているだけではないでしょうか?
Formクラスのメンバを調べてみましょう。
Controlsというメンバはどこから来ているでしょう?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-08-05 18:39
ちなみに、
Form.ControlCollection は
Control.ControlCollection から派生しているので、
もし Me.Controls の型が Form.ControlCollection
だったとしても、渡す事は出来ますね。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-08-05 18:51
何度もすみません。
引用:

Form.ControlCollection は
Control.ControlCollection から派生しているので、
もし Me.Controls の型が Form.ControlCollection
だったとしても、渡す事は出来ますね。


ドキュメント見ながら書いてたんですが、動かして試してみると
Form の Controls は Form.ControlCollection みたいですね…
「Control から継承されます」って記述されてたのでだまされてしまいました…m(_ _)m

スキルアップ/キャリアアップ(JOB@IT)