- - PR -
【VB.NET】Form上のコントロール一覧を取得する方法
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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上のコントロール一覧を取得する方法を ご存知でしたら教えて下さい。 | ||||
|
投稿日時: 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-08-05 18:03
Control.ControlCollectionでないといけないのなら Public Sub ControlList(ByVal f As Control.ControlCollection) とすればよいと思うんですけど、なんか勘違いしてますかね? | ||||
|
投稿日時: 2003-08-05 18:08
何も指定しないとForm.ControlCollectionになるのは、Form内で記述しているからです。 # 実際には継承したメンバですが… | ||||
|
投稿日時: 2003-08-05 18:21
Call ControlList(Me.Controls)
ここでForm.ControlCollectionを引数に使っていて、 Call ControlList(c.Controls) ここでControl.ControlCollectionを引数に渡しているので どちらかを指定するとどちらかでエラーが起こると思ったのです。 どちらも使いたい場合はどう指定すればいいのか・・・ >何も指定しないとForm.ControlCollectionになるのは、Form内で記述しているからです。 なるほど! | ||||
|
投稿日時: 2003-08-05 18:33
Me.Controlsの型は、本当にForm.ControlCollectionでしょうか? そう思い込んでしまっているだけではないでしょうか? Formクラスのメンバを調べてみましょう。 Controlsというメンバはどこから来ているでしょう? | ||||
|
投稿日時: 2003-08-05 18:39
ちなみに、
Form.ControlCollection は Control.ControlCollection から派生しているので、 もし Me.Controls の型が Form.ControlCollection だったとしても、渡す事は出来ますね。 | ||||
|
投稿日時: 2003-08-05 18:51
何度もすみません。
ドキュメント見ながら書いてたんですが、動かして試してみると Form の Controls は Form.ControlCollection みたいですね… 「Control から継承されます」って記述されてたのでだまされてしまいました…m(_ _)m |