2016-08-31 5 views
1

텍스트 상자가 포함 된 그룹 상자가 있고이 상자를 모두 ReadOnly = True로 설정하려고합니다. 여기 (작동하지 않습니다) 내가 뭘하려 :루프 - 모든 그룹 상자에서 텍스트 상자를 ReadOnly로 설정

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

당신이 일을 큰 거래를 단순화 할 수 있습니다 :

편집 (나는에 대한 분할 컨테이너를 잊었). 모든 종류의 Control 컬렉션을 살펴 보는 대신 배열을 만들어 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

관련 문제