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

解決


まいける  2009-11-01 20:08:54  No: 102050

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

Dim textb As TextBox

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

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


オショウ  2009-11-01 21:21:30  No: 102051

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 21:57:42  No: 102052

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

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


オショウ  2009-11-01 22:39:22  No: 102053

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-02 00:11:24  No: 102054

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

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


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

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






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