다음을 통해 공유


DataRepeater 컨트롤의 가상 모드(Visual Studio)

표 형식의 대용량 데이터를 DataRepeater 컨트롤에 표시하려는 경우 VirtualMode 속성을 True로 설정하고 컨트롤과 해당 데이터 소스의 상호 작용을 명시적으로 관리하여 성능을 향상시킬 수 있습니다. DataRepeater 컨트롤은 런타임에 필요한 경우 데이터 소스와 상호 작용하고 데이터를 표시하기 위해 처리할 수 있는 여러 가지 이벤트를 제공합니다.

가상 모드 작동 방식

DataRepeater 컨트롤에 대한 가장 일반적인 시나리오는 디자인 타임에 ItemTemplate의 자식 컨트롤을 데이터 소스에 바인딩하고 BindingSource에서 필요한 경우 데이터를 앞뒤로 전달할 수 있도록 하는 것입니다. 가상 모드를 사용하는 경우 컨트롤이 데이터 소스에 바인딩되지 않으며 런타임에 데이터가 기본 데이터 소스에 앞뒤로 전달됩니다.

VirtualMode 속성이 True로 설정되면 데이터 소스 창에서 바인딩된 컨트롤을 추가하는 대신 도구 상자에서 컨트롤을 추가하여 사용자 인터페이스를 만듭니다.

이벤트는 컨트롤별로 발생하며 사용자는 데이터 표시를 처리하는 코드를 추가해야 합니다. 새 DataRepeaterItem이 뷰로 스크롤되면 각 컨트롤에 대해 ItemValueNeeded 이벤트가 한 번 발생하며 사용자는 ItemValueNeeded 이벤트 처리기에서 각 컨트롤에 대한 값을 제공해야 합니다.

컨트롤 중 하나의 데이터가 사용자에 의해 변경되면 ItemValuePushed 이벤트가 발생하며 사용자는 데이터의 유효성을 검사하고 데이터를 데이터 소스에 저장해야 합니다.

사용자가 새 항목을 추가하면 NewItemNeeded 이벤트가 발생합니다. 이 이벤트 처리기를 사용하여 데이터 소스에 새 레코드를 만들 수 있습니다. 원하지 않는 변경 작업이 수행되지 않게 하려면 각 컨트롤에 대한 KeyDown 이벤트를 모니터링하고 사용자가 Esc 키를 누를 때 CancelEdit를 호출해야 합니다.

데이터 소스가 변경되면 BeginResetTemplateItem() 및 EndResetTemplateItem() 메서드를 호출하여 DataRepeater 컨트롤을 새로 고칠 수 있습니다. 두 메서드는 반드시 순서대로 호출해야 합니다.

마지막으로 항목이 삭제될 때 발생하는 ItemsRemoved 이벤트와 사용자가 Delete 키를 눌러 항목을 삭제할 때마다 발생하는 UserDeletingItemsUserDeletedItems 이벤트(옵션)에 대한 이벤트 처리기를 구현해야 합니다.

가상 모드 구현

가상 모드를 구현하는 데 필요한 단계는 다음과 같습니다.

가상 모드를 구현하려면

  1. 도구 상자Visual Basic PowerPacks 탭에서 폼 또는 컨테이너 컨트롤로 DataRepeater 컨트롤을 끌어 옵니다. VirtualMode 속성을 True으로 설정합니다.

  2. 도구 상자에서 DataRepeater 컨트롤의 항목 템플릿 영역(위쪽 영역)으로 컨트롤을 끌어 옵니다. 표시할 데이터 소스의 각 필드에 대해 하나의 컨트롤이 필요합니다.

  3. 각 컨트롤에 대한 값을 제공하는 ItemValueNeeded 이벤트에 대한 처리기를 구현합니다. 새 DataRepeaterItem이 뷰로 스크롤될 때 이 이벤트가 발생합니다. 코드는 Employees라는 데이터 소스에 대한 다음 예제와 유사합니다.

    Private Sub DataRepeater1_ItemValueNeeded(
        ByVal sender As Object, 
        ByVal e As Microsoft.VisualBasic.PowerPacks.DataRepeaterItemValueEventArgs
      ) Handles DataRepeater1.ItemValueNeeded
        If e.ItemIndex < Employees.Count Then
            Select Case e.Control.Name
                Case "txtFirstName"
                    e.Value = Employees.Item(e.ItemIndex + 1).firstName
                Case "txtLastName"
                    e.Value = Employees.Item(e.ItemIndex + 1).lastName
            End Select
        End If
    End Sub
    
    private void dataRepeater1_ItemValueNeeded(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterItemValueEventArgs e)
    {
        if (e.ItemIndex < Employees.Count)
        {
            switch (e.Control.Name)
            {
                case "txtFirstName":
                    e.Value = Employees[e.ItemIndex + 1].firstName;
                    break;
                case "txtLastName":
                    e.Value = Employees[e.ItemIndex + 1].lastName;
                    break;
            }
        }
    }
    
  4. 데이터를 저장하는 ItemValuePushed 이벤트 처리기를 구현합니다. 사용자가 DataRepeaterItem의 자식 컨트롤에 대한 변경 내용을 커밋할 때 이 이벤트가 발생합니다. 코드는 Employees라는 데이터 소스에 대한 다음 예제와 유사합니다.

    Private Sub DataRepeater1_ItemValuePushed(
        ByVal sender As Object, 
        ByVal e As Microsoft.VisualBasic.PowerPacks.DataRepeaterItemValueEventArgs
      ) Handles DataRepeater1.ItemValuePushed
    
        Dim emp As Employee = Employees.Item(e.ItemIndex)
        Select Case e.Control.Name
            Case "txtFirstName"
                emp.firstName = e.Control.Text
            Case "txtLastName"
                emp.lastName = e.Control.Text
            Case Else
                MsgBox("Error during ItemValuePushed unexpected control: " & 
                    e.Control.Name)
        End Select
    End Sub
    
    private void dataRepeater1_ItemValuePushed(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterItemValueEventArgs e)
    {
        Employee emp = Employees[e.ItemIndex];
        switch (e.Control.Name)
        {
            case "txtFirstName":
                emp.firstName = e.Control.Text;
                break;
            case "txtLastName":
                emp.lastName = e.Control.Text;
                break;
            default:
                MessageBox.Show("Error during ItemValuePushed unexpected control: " + e.Control.Name);
                break;
        }
    }
    
  5. 각 자식 컨트롤의 KeyDown 이벤트 처리기를 구현하고 Esc 키를 모니터링합니다. ItemValuePushed 이벤트가 발생하지 않도록 CancelEdit 메서드를 호출합니다. 코드는 다음 예제와 같습니다.

    Private Sub Child_KeyDown(
        ByVal sender As Object, 
        ByVal e As System.Windows.Forms.KeyEventArgs
      ) Handles txtFirstName.KeyDown, txtLastName.KeyDown
    
        If e.KeyCode = Keys.Escape Then
            Datarepeater1.CancelEdit()
        End If
    End Sub
    
    private void child_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Escape)
        {
            this.dataRepeater1.CancelEdit();
        }
    }
    
  6. NewItemNeeded 이벤트 처리기를 구현합니다. 사용자가 DataRepeater 컨트롤에 새 항목을 추가하면 이 이벤트가 발생합니다. 코드는 Employees라는 데이터 소스에 대한 다음 예제와 유사합니다.

    Private Sub DataRepeater1_NewItemNeeded(
      ) Handles DataRepeater1.NewItemNeeded
    
        Dim newEmployee As New Employee
        Employees.Add(newEmployee)
        blnNewItemNeedEventFired = True
    End Sub
    
    private void dataRepeater1_NewItemNeeded(object sender, System.EventArgs e)
    {
        Employee newEmployee = new Employee();
        Employees.Add(newEmployee);
        blnNewItemNeedEventFired = true;
    }
    
  7. ItemsRemoved 이벤트 처리기를 구현합니다. 이 이벤트는 사용자가 기존 항목을 삭제할 때 발생합니다. 코드는 Employees라는 데이터 소스에 대한 다음 예제와 유사합니다.

    Private Sub DataRepeater1_ItemsRemoved(
        ByVal sender As Object, 
        ByVal e As Microsoft.VisualBasic.PowerPacks.DataRepeaterAddRemoveItemsEventArgs
      ) Handles DataRepeater1.ItemsRemoved
    
        Employees.RemoveAt(e.ItemIndex)
    End Sub
    
    private void dataRepeater1_ItemsRemoved(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterAddRemoveItemsEventArgs e)
    {
        Employees.RemoveAt(e.ItemIndex);
    }
    
  8. 컨트롤 수준 유효성 검사의 경우 자식 컨트롤의 Validating 이벤트에 대한 처리기를 구현할 수 있습니다. 코드는 다음 예제와 같습니다.

    Private Sub Text_Validating(
        ByVal sender As Object, 
        ByVal e As System.ComponentModel.CancelEventArgs
      ) Handles txtFirstName.Validating, txtLastName.Validating
    
        If txtFirstName.Text = "" Then
            MsgBox("Please enter a name.")
            e.Cancel = True
        End If
    End Sub
    
    private void Text_Validating(object sender, System.ComponentModel.CancelEventArgs e)
    {
        if (txtFirstName.Text == "")
        {
            MessageBox.Show("Please enter a name.");
            e.Cancel = true;
        }
    }
    

참고 항목

참조

ItemValuePushed

NewItemNeeded

ItemValueNeeded

개념

DataRepeater 컨트롤 소개(Visual Studio)