Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

孫コントロールも含めてのグループ分けについて 解決済み

タグの編集...

投稿者 青の水   (学生)   投稿日時 2022/5/17 16:59:14
現在、フォーム上にボタンを複数配置しており、グループボックス内にもボタンを配置しています。
ボタンを押すとNameプロパティを""(空文字)にしたいと考えています。

Nameプロパティを変更したいボタンのTagプロパティに"Top"と設定しているので以下のように書いたのですが、グループボックス内のボタンに適応されず困っています。

2行目のMeの部分をGroupBox1等に変更すれば、解決はするのですが、一つのループで対応することはできないのでしょうか?
ご回答のほどよろしくお願いいたします。

Dim o As Control

        For Each o In Me.Controls

            If o.Tag = "Top" Then

               テキストを””にする処理

            'End If

        Next

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2022/5/17 17:39:52
> ボタンを押すとNameプロパティを""(空文字)にしたいと考えています。

それは何故ですか?

Text や Tag なら分かりますが、Name を動的に変更するメリットが思い当たらないので、
参考までに理由を教えていただきたいです。


これがデザイン時ではなく、実行時にコントロールを配置するような場合であれば、
Name を空にしたり、複数のコントロールに同じ Name を与えることもありますけれどね…。

とはいえその場合も、コントロールを配置する際に Name を決定するのが普通であり、
配置済みのコントロール名を変更する理由にはならないと思うので。


> グループボックス内のボタンに適応されず困っています。
In Me.Controls ではなく、In GroupBox1.Controls にしたくないのであれば、
再帰的に処理すれば良いと思いますよ。

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2022/5/17 17:47:48
> 再帰的に処理すれば良いと思いますよ。
例えばこんな感じ。

Public Module ControlExtensions
    <System.Runtime.CompilerServices.Extension>
    Public Function GetDescendants(source As Control) As IEnumerable(Of Control)
        Dim children = source.Controls.Cast(Of Control)()
        Return children.Concat(children.SelectMany(AddressOf GetDescendants))
    End Function
End Module



上記の Module を用意しておけば、
 For Each o As Control In Me.GetDescendants()
のようにして、子孫コントロールまで再帰的に列挙できます。

投稿者 青の水   (学生)   投稿日時 2022/5/17 17:51:39
ご回答ありがとうございます。

理由はそういう課題だからというわけですが、ラベルのテキストを変更すると考えていただいてもかまいません。

再帰的にというのが初耳のため調べてみたいと思います!

投稿者 青の水   (学生)   投稿日時 2022/5/19 11:11:12
解決いたしました。