Share via


Modo virtual del control DataRepeater (Visual Studio)

Si desea mostrar grandes volúmenes de datos en formato de tabla en un control DataRepeater, puede mejorar el rendimiento estableciendo la propiedad VirtualMode en True y controlando de forma explícita la interacción del control con su origen de datos. El control DataRepeater proporciona varios eventos que permiten controlar la interacción con el origen de datos y mostrar los datos según sea necesario en tiempo de ejecución.

Cómo funciona el modo virtual

El escenario más común para el control DataRepeater es enlazar en tiempo de diseño los controles secundarios de ItemTemplate a un origen de datos y permitir que BindingSource intercambie datos en ambos sentidos según sea necesario. Cuando se utiliza el modo virtual, los controles no se enlazan a un origen de datos, por lo que los datos se intercambian en ambos sentidos con el origen de datos subyacente.

Cuando la propiedad VirtualMode se establece en True, se crea la interfaz de usuario agregando controles del Cuadro de herramientas en lugar de agregar los controles enlazados en la ventana Orígenes de datos.

Los eventos se provocan individualmente para cada control y es preciso agregar código para controlar la presentación de los datos. Cuando un nuevo DataRepeaterItem se desplaza y queda visible, el evento ItemValueNeeded se provoca una vez por cada control; debe proporcionar los valores correspondientes a cada control en el controlador de eventos ItemValueNeeded.

Si el usuario cambia los datos de uno de los controles, se provoca el evento ItemValuePushed, en cuyo caso deberá validar los datos y guardarlos en el origen de datos.

Si el usuario agrega un nuevo elemento, se provoca el evento NewItemNeeded. Utilice el controlador de este evento para crear un nuevo registro en el origen de datos. Para evitar los cambios imprevistos, también debe supervisar el evento KeyDown de cada control y llamar al método CancelEdit si el usuario presiona la tecla ESC.

Si el origen de datos cambia, puede actualizar el control DataRepeater mediante una llamada a los métodos BeginResetTemplateItem y EndResetTemplateItem. Se debe llamar a ambos métodos por orden.

Por último, debe implementar los controladores del evento ItemsRemoved, que se provoca cuando se elimina un elemento y, opcionalmente, para los eventos UserDeletedItems y UserDeletingItems, que se provocan cada vez que un usuario elimina un elemento presionando la tecla SUPR.

Implementar el modo virtual

A continuación se muestran los pasos necesarios para implementar el modo virtual.

Para implementar el modo virtual

  1. Arrastre un control DataRepeater desde la ficha Visual Basic PowerPacks del Cuadro de herramientas hasta un control de formulario o un control contenedor. Establezca la propiedad VirtualMode en True.

  2. Arrastre los controles desde el Cuadro de herramientas hasta la región de la plantilla de elemento (la región superior) del control DataRepeater. Necesitará un control para cada campo del origen de datos que desee mostrar.

  3. Implemente un controlador para que el evento ItemValueNeeded proporcione valores para cada control. Se provoca este evento cuando un nuevo DataRepeaterItem se desplaza y queda visible. El código será similar al siguiente ejemplo, que se aplica a un origen de datos denominado 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. Implemente un controlador para que el evento ItemValuePushed almacene los datos. Se provoca este evento cuando el usuario confirma los cambios y los escribe en un control secundario de DataRepeaterItem. El código será similar al siguiente ejemplo, que se aplica a un origen de datos denominado 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. Implemente un controlador para el evento KeyDown de cada control secundario y supervise la tecla ESC. Llame al método CancelEdit para evitar que se provoque el evento ItemValuePushed. El código tendrá un aspecto similar al ejemplo siguiente.

    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. Implemente un controlador para el evento NewItemNeeded. Se provoca este evento cuando el usuario agrega un nuevo elemento al control DataRepeater. El código será similar al siguiente ejemplo, que se aplica a un origen de datos denominado 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. Implemente un controlador para el evento ItemsRemoved. Este evento se produce cuando un usuario elimina un elemento existente. El código será similar al siguiente ejemplo, que se aplica a un origen de datos denominado 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 efectuar una validación de nivel de control, puede implementar controladores para los eventos Validating de los controles secundarios. El código tendrá un aspecto similar al ejemplo siguiente.

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

Vea también

Referencia

ItemValuePushed

NewItemNeeded

ItemValueNeeded

Conceptos

Introducción al control DataRepeater (Visual Studio)