다음을 통해 공유


Visual Basic 6.0 사용자를 위한 컨트롤 배열

업데이트: 2007년 11월

Visual Basic 2008에서는 컨트롤 배열이 더 이상 지원되지 않지만 이벤트 모델을 사용하여 대부분의 컨트롤 배열 기능을 복제하고 확장할 수 있습니다.

개념적 차이

Visual Basic 6.0에서는 컨트롤 배열을 사용하여 폼의 컨트롤을 관리할 수 있었습니다. 컨트롤 배열은 이벤트 처리기 공유, 컨트롤 그룹 반복 및 런타임에 컨트롤 추가에 대한 기능을 제공했습니다.

Visual Basic 2008에서는 컨트롤 배열이 더 이상 지원되지 않습니다. 이벤트 모델에 적용된 변경 사항 때문에 컨트롤 배열이 필요하지 않게 되었으며 .NET Framework에서는 컨트롤 작업에 필요한 동일한 기능을 제공합니다.

이벤트 처리기 공유

Visual Basic 6.0의 경우 이벤트 집합을 공유하는 컨트롤 그룹을 컨트롤 배열을 사용하여 지정할 수 있었습니다. 이 경우 각 컨트롤에는 동일한 형식과 동일한 이름을 사용해야 했습니다.

Visual Basic 2008에서는 이벤트 처리기를 사용하여 여러 컨트롤의 이벤트는 물론 이름과 형식이 다른 이벤트까지 처리할 수 있습니다.

예를 들어, 두 개의 Button 컨트롤(Button1 및 Button2)과 하나의 CheckBox 컨트롤(CheckBox1)을 폼에 추가한 다음 이벤트 처리기를 만들어 세 컨트롤 모두에 대한 Click 이벤트를 처리하도록 할 수 있습니다.

Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, CheckBox1.Click

컨트롤 반복

또한 Visual Basic 6.0의 컨트롤 배열을 사용하면 Index 속성을 통해 컨트롤 그룹을 반복할 수 있습니다. 예를 들어, 컨트롤 배열에서 모든 TextBox 컨트롤의 텍스트를 지우려면 Index 속성을 루프 변수로 사용하여 컨트롤 배열을 반복할 수 있습니다.

Visual Basic 2008의 컨트롤에는 Index 속성이 없지만 Control 클래스의 Control.ControlCollection을 사용하여 폼 또는 컨테이너에서 컨트롤을 반복할 수 있습니다.

Visual Basic 6.0에서는 단일 컨트롤 배열의 컨트롤이 여러 컨테이너에 있을 수 있습니다. 예를 들어, 서로 다른 두 Frame 컨트롤에 포함된 TextBox 컨트롤은 동일한 컨트롤 배열의 일부일 수 있습니다.

Visual Basic 2008에서는 Controls 컬렉션에서 단일 컨테이너에 있는 컨트롤만 반환합니다. 재귀 함수를 사용하여 각 컨테이너 컨트롤의 컨트롤을 개별적으로 반복해야 합니다.

런타임에 컨트롤 추가

Visual Basic 6.0에서는 Load 문을 사용하여 런타임에 컨트롤을 컨트롤 배열에 추가할 수 있습니다. 그러나 컨트롤 형식이 컨트롤 배열 형식과 같아야 하고 디자인 타임에 하나 이상의 요소를 사용하여 컨트롤 배열을 만들어야 합니다. 또한 컨트롤을 추가한 다음에는 Visible 속성을 True로 설정합니다.

Visual Basic 2008에서는 Dim 문에 New 키워드를 사용한 다음 컨트롤을 추가할 컨테이너에 대한 Add 메서드를 사용하여 런타임에 컨트롤을 추가합니다.

런타임에 이벤트 처리기 추가

Visual Basic 6.0에서는 런타임에 컨트롤이 컨트롤 배열에 추가되면 컨트롤 배열의 이벤트에서 새 컨트롤 이벤트가 자동으로 처리되었습니다.

Visual Basic 2008에서는 런타임에 추가한 컨트롤에 대한 이벤트 처리기를 정의해야 합니다. 이 작업은 AddHandler 문을 사용하여 수행됩니다.

컨트롤 배열에 대한 코드 변경 사항

다음 코드 예제에서는 Visual Basic 6.0과 Visual Basic 2008 간의 코딩 기술 차이점을 보여 줍니다.

이벤트 처리기 공유

다음 예제에서는 세 TextBox 컨트롤로 구성된 그룹에 대해 Change 이벤트 처리기Visual Basic 2008에서는 TextChanged)를 공유하는 방법을 보여 줍니다. Visual Basic 2008에서 이벤트 처리기의 Handles 절은 이벤트에서 처리할 컨트롤을 지정합니다. 이벤트 처리기에서 제네릭 Object를 반환하기 때문에 DirectCast 메서드를 사용하여 처리하려는 특정 개체 형식(이 경우에는 TextBox)으로 이벤트 처리기를 캐스팅해야 합니다.

' Visual Basic 6.0

Private Sub Text1_Change(Index As Integer)

Select Case Index

Case 0

MsgBox("The text in the first TextBox has changed")

Case 1

MsgBox("The text in the second TextBox has changed")

Case 2

MsgBox("The text in the third TextBox has changed")

End Select

End Sub

' Visual Basic
Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles TextBox1.TextChanged, _
TextBox2.TextChanged, TextBox3.TextChanged
    Select Case DirectCast(sender, TextBox).Name
        Case TextBox1.Name
            MsgBox("The text in the first TextBox has changed")
        Case TextBox2.Name
            MsgBox("The text in the second TextBox has changed")
        Case TextBox3.Name
            MsgBox("The text in the third TextBox has changed")
    End Select
End Sub
참고:

Visual Basic 2008의 이벤트 동작은 약간 다릅니다. 런타임에 텍스트를 변경하는 경우는 물론 각 컨트롤을 Form_Load 이벤트 등에서 초기화하는 경우에도 TextChanged 이벤트가 발생합니다. Visual Basic 6.0에서는 텍스트를 변경하는 경우에만 Change 이벤트가 발생했습니다.

컨트롤 반복

다음 예제에서는 텍스트 상자 컨트롤 그룹을 반복하고 해당 텍스트를 지우는 함수를 보여 줍니다. Visual Basic 6.0 예제에서 컨트롤 배열의 Index 속성은 루프 변수로 사용됩니다.

Visual Basic 2008에서는 Control 개체가 인수로 전달되며 이 개체에는 해당 컨트롤에 위치한 모든 컨트롤을 포함하는 Control.ControlCollection 컬렉션이 있습니다. Typeof 연산자는 각 컨트롤의 형식이 TextBox인지를 확인하는 데 사용됩니다.

참고:

Form 개체의 형식이 Control이므로 Form을 인수로 전달할 수도 있습니다.

Control.ControlCollection 컬렉션에는 중첩된 컨트롤이 포함되지 않기 때문에 HasChildren 메서드를 사용하여 각 컨트롤에 다른 컨트롤이 포함되어 있는지 여부를 확인합니다. 포함되어 있는 경우에는 ClearText 함수가 재귀적으로 호출됩니다.

' Visual Basic 6.0

Private Sub ClearText()

For i = 0 To Text1().UBound

Text1(i).Text = ""

Next

End Sub

' Visual Basic
Private Sub ClearText(ByVal container As Control)
    Dim ctrl As Control
    For Each ctrl In container.Controls
        If TypeOf (ctrl) Is TextBox Then
            ctrl.Text = ""
        End If
        If ctrl.HasChildren Then
             ClearText(ctrl)
        End If
    Next
End Sub

런타임에 컨트롤 추가

다음 예제에서는 런타임에 텍스트 상자 컨트롤을 폼에 추가하는 방법을 보여 줍니다. Visual Basic 6.0에서는 컨트롤이 컨트롤 배열에 추가됩니다. Visual Basic 2008에서 컨트롤은 Control.ControlCollection 컬렉션에 추가됩니다. Visual Basic 6.0에서는 새 TextBox에 대한 이벤트가 컨트롤 배열에서 자동으로 처리됩니다. Visual Basic 2008에서는 AddHandler 문을 통해 이벤트 처리를 후크해야 합니다.

두 예제 모두에서 디자인 타임에 텍스트 상자 컨트롤이 폼에 추가된 것으로 가정하고 Visual Basic 6.0 예제에서는 단일 요소 컨트롤 배열을 만든 것으로 가정합니다. 또한 Visual Basic 2008 예제에서는 첫 번째 TextBox 컨트롤에 대해 TextChangedHandler라는 이벤트 처리기가 있다고 가정합니다.

' Visual Basic 6.0

Private Sub AddControl()

' Add a TextBox as the second element of a control array.

Load Text1(1)

' Set the location below the first TextBox.

Text1(1).Move Text1(0).Left, Text1(0).Top + 500

' Make the new TextBox visible

Text1(1).Visible = True

' Visual Basic
' Declare a new TextBox.
Dim TextBox2 As New TextBox
' Set the location below the first TextBox
TextBox2.Left = TextBox1.Left
TextBox2.Top = TextBox1.Top + 30
' Add the TextBox to the form's Controls collection.
Me.Controls.Add(TextBox2)
AddHandler TextBox2.TextChanged, AddressOf TextChangedHandler

업그레이드 참고 사항

Visual Basic 6.0으로 만든 응용 프로그램을 Visual Basic 2008로 업그레이드하면 모든 컨트롤 배열이 특수한 컨트롤 관련 컨트롤 배열 클래스로 업그레이드됩니다. 이러한 클래스는 Microsoft.VisualBasic.Compatibility.VB6 네임스페이스에 포함되며 업그레이드 도구에서 Visual Basic 6.0 컨트롤 배열의 동작을 에뮬레이트하는 데 사용됩니다.

새 Visual Basic 2008 개발에서도 이러한 컨트롤 배열 클래스를 사용할 수 있지만 .NET Framework 이벤트 모델과 함수를 대신 사용하는 것이 좋습니다.

참고 항목

개념

Visual Basic 6.0 사용자를 위한 이벤트 및 이벤트 처리

기타 리소스

Visual Basic 6.0 사용자를 위한 Windows Forms 컨트롤