Modo virtual no controle DataRepeater (Visual Studio)

Quando você deseja exibir grandes quantidades de dados tabulares em um DataRepeater controle, você pode melhorar o desempenho, definindo a VirtualMode propriedade para True e explicitamente gerenciar a interação do controle com sua fonte de dados. O DataRepeater o controle fornece vários eventos que você pode manipular para interagir com sua fonte de dados e exibir os dados conforme a necessidade em tempo de execução.

Como as Virtual funciona de modo

O cenário mais comum para o DataRepeater é ligar os controles filho do controle a ItemTemplate para um dado em tempo de design de fonte e permitir que o BindingSource para passar dados e para trás, conforme necessário. Quando você usa o modo virtual, os controles não estão vinculados a uma fonte de dados e os dados são passados e para trás com a fonte de dados subjacente em tempo de execução.

Quando o VirtualMode propriedade estiver definida como True, você criar a interface do usuário adicionando controles a partir do Toolbox em vez de adicionar controles de limite da Fontes de dados janela.

Eventos são gerados em uma base de controle por controle e você deve adicionar código para manipular a exibição de dados. Quando um novo DataRepeaterItem é colocada na exibição, o ItemValueNeeded evento é gerado uma vez para cada controle e você deve fornecer os valores para cada controle no ItemValueNeeded manipulador de eventos.

Se os dados em um dos controles são alterados pelo usuário, o ItemValuePushed evento é gerado e você deve validar os dados e salvá-lo em sua fonte de dados.

Se o usuário adiciona um novo item, o NewItemNeeded evento é gerado. Use os manipulador do evento para criar um novo registro na fonte de dados. Para evitar alterações indesejadas, você também deve monitorar o KeyDown o evento para cada controle e a chamada CancelEdit se o usuário pressionar a tecla ESC.

Se as alterações de fonte de dados, você poderá atualizar o DataRepeater controle chamando o BeginResetTemplateItem() e EndResetTemplateItem() métodos. Ambos os métodos devem ser chamados na ordem.

Finalmente, você deve implementar manipuladores de eventos para o ItemsRemoved evento, que ocorre quando um item é excluído e, opcionalmente, para o UserDeletingItems e UserDeletedItems eventos, que ocorrem sempre que um usuário exclui um item pressionando a tecla DELETE.

Implementando o modo Virtual

A seguir estão as etapas necessárias para implementar o modo virtual.

Para implementar o modo virtual

  1. Arrastar um DataRepeater de controle da Visual Basic PowerPacks guia o Toolbox a um controle de formulário ou recipiente. Defina a propriedade VirtualMode como True.

  2. Arraste os controles a partir o Toolbox até a região de modelo de item (a região superior) da DataRepeater de controle. Você precisará de um controle para cada campo na fonte de dados que você deseja exibir.

  3. Implementar um manipulador para o ItemValueNeeded o evento para fornecer valores para cada controle. Este evento é gerado quando um novo DataRepeaterItem é rolada em modo de exibição. O código parecerá com o exemplo a seguir, que é uma fonte de dados denominada 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. Implementar um manipulador para o ItemValuePushed o evento para armazenar dados. Este evento é gerado quando o usuário confirma as alterações para um controle filho de DataRepeaterItem. O código parecerá com o exemplo a seguir, que é uma fonte de dados denominada 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. Implementar um manipulador para do cada controle filho KeyDown de eventos e monitor a tecla ESC. Chamar o CancelEdit método para impedir que o ItemValuePushed o evento de disparo. O código parecerá com o exemplo a seguir.

    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. Implementar um manipulador para o NewItemNeeded de evento. Este evento é gerado quando o usuário adiciona um novo item para o DataRepeater de controle. O código parecerá com o exemplo a seguir, que é uma fonte de dados denominada 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. Implementar um manipulador para o ItemsRemoved de evento. Esse evento ocorre quando um usuário exclui um item existente. O código parecerá com o exemplo a seguir, que é uma fonte de dados denominada 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. Para validação de nível de controle, opcionalmente Implemente manipuladores para os Validating eventos dos controles filho. O código parecerá com o exemplo a seguir.

    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;
        }
    }
    

Consulte também

Referência

ItemValuePushed

NewItemNeeded

ItemValueNeeded

Conceitos

Introdução ao controle DataRepeater (Visual Studio)