2016-08-31 2 views
1

私はテキストボックスを含むグループボックスを持っており、それらをすべてReadOnly = Trueに設定します。ここで私は(動作しない)しようとしたものです:すべてのグループボックスでテキストボックスをReadOnlyにループ設定します

EDIT(私はスプリットコンテナを忘れてしまった):

For Each SplitCon As Control In Me.Controls 
    If TypeOf SplitCon Is SplitContainer Then 
     For Each GBox As Control In SplitCon.Controls 
      If TypeOf GBox Is GroupBox Then 
       For Each ctrl As Control In GBox.Controls 
        If TypeOf (ctrl) Is TextBox Then 
         CType(ctrl, TextBox).ReadOnly = True 
        End If 
       Next 
      End If 
     Next 
    End If 
Next 
+0

エラーが表示されますか?デバッガのコードをステップ実行して、「For Each GBox As Control in Me.Controls」から取得したものを確認しましたか? – Tim

+0

私は何のエラーも出ません。何もしません。 – LuckyLuke82

+0

あなたのグループボックスは、パネルのような他のコンテナの中やフォームの上に座っていますか? –

答えて

1

あなたは物事に多くのことを簡素化することができます。あらゆる種類のコントロールコレクションを調べるのではなく、ToDoリストとして機能する配列を作成します。次に、使用されているループのTypeOfとCTypeをすべて取り除くことができます。

' the ToDo list 
Dim GrpBoxes = New GroupBox() {Groupbox1, Groupbox2, 
          Groupbox3, Groupbox4} 

For Each grp In GrpBoxes 
    For Each tb As TextBox In grp.Controls.OfType(Of TextBox)() 
     tb.ReadOnly = True 
    Next 
Next 

あなたのコードは、瞬間のフォームレイアウトに依存しなくなりました。覚えておかなければならないのは、新しいGroupBoxアイテムをリストに追加することだけです。また、For Eachステートメントの中でも、配列全体を一度宣言することができます。

Controlオブジェクトではなく、Controls.OfType(Of T)がコレクションをフィルタリングし、その型のオブジェクト変数を返しますそれをキャストしたり、関心のないコントロールをスキップしたりする必要はありません。Whereメソッドをタックして、リストをさらに絞り込んで、特定の名前またはTagのものだけを含めるようにすることもできます。

+0

うーん、うまくやって、それは動作します。配列を考えなかった。はい、次回は "Controls.OfType(Of ...)"を使用しようとしますが、それはさらに短くなります。再度、感謝します :) – LuckyLuke82

関連する問題