タブコントロールでのFor Each 文の使い方

解決


まいける  2009-11-01 11:08:54  No: 102050  IP: [192.*.*.*]

VB.NET2005です。
タブコントロール各ページに配置したTextboxすべてを対象に処理したいのですが、(例としてタブ5ページ、各ページにTextboxが3個、計15個あるとします)

Dim textb As TextBox

For Each textb In TabControl1.Controls
    '各Textboxの入力内容のチェック処理等
Next

としてもエラーになってしまいます。どのようにすれば正しく動作いたしますでしょうか。よろしくお願いします。

編集 削除
オショウ  2009-11-01 12:21:30  No: 102051  IP: [192.*.*.*]

For Each tabctl As TabPage In TabControl1.TabPages
            For Each ctl As Object In tabctl.Controls
                If ctl.Name.ToString.IndexOf("TextBox") > -1 Then
                    Dim tb As TextBox
                    tb = DirectCast(ctl, TextBox)
                End If
            Next
        Next


こうかナ〜・・・

以上。参考まで

編集 削除
まいける  2009-11-01 12:57:42  No: 102052  IP: [192.*.*.*]

オショウさま、早々に、ご返答ありがとうございます。
試してみました。確かに動作しました。
す、すごい、すごすぎます。驚きです。
簡単のようですが、物凄いテクニックとお察しいたします。

あつかましいお願いですが、tb=DirectCast(ctl, TextBox)の意味は何でしょうか、他にどのような場面で使われますでしょうか。お手数でなければご教授ください。
オショウさま本当にありがとうございました。(感謝、合掌)

編集 削除
オショウ  2009-11-01 13:39:22  No: 102053  IP: [192.*.*.*]

ctl As Object で、そのタブ上の全てのコントロールを
取ってきますので、その各々のコントロールのタイプで
独自のメソッドにアクセスするには、Dim tb As TextBox
として、tb = DirectCast(ctl, TextBox) すれば、後は
簡単にアクセスできるからです。

これが、取得したいコントロールが、RadioButtonであっ
た場合は・・・

ctl.Name.ToString.IndexOf("RadioButton")
と変更し
Dim rb As RadioButton
rb = DirectCast(ctl, RadioButtoon)
とすれば、OKです。

応用はできますので、お試しあれ・・・

※  本当は、コントロールな名前で取得するのではなく
    タイプで取得するのが、正解かと・・・

    コントロールの名前を変更した場合、この方法では
    取れません。

    よって・・・

    If TypeOf ctl Is TextBox Then

    と変更して下さい。

以上。

編集 削除
まいける  2009-11-01 15:11:24  No: 102054  IP: [192.*.*.*]

オショウさま、ご教授いただきましてありがとうございます。
なるほど、このような内容なんですね。たいへん勉強になりました。
いろいろと応用し活用してみます。

また何かありましたらよろしくお願いいたします。
ありがとうございました。

編集 削除