Condividi tramite


Modalità virtuale nel controllo DataRepeater (Visual Studio)

Per visualizzare quantità elevate di dati in formato tabulare in un controllo DataRepeater, è possibile migliorare le prestazioni impostando la proprietà VirtualMode su True e gestendo in modo esplicito l'interazione del controllo con la relativa origine dati. Il controllo DataRepeater fornisce diversi eventi che è possibile gestire per interagire con l'origine dati e visualizzare i dati secondo necessità in fase di esecuzione.

Funzionamento della modalità virtuale

Nello scenario più comune per il controllo DataRepeater, i controlli figlio di ItemTemplate vengono associati in fase di progettazione a un'origine dati e viene consentito il passaggio dei dati da parte di BindingSource secondo necessità. Quando si utilizza la modalità virtuale, i controlli non vengono associati a un'origine dati e i dati vengono passati in fase di esecuzione all'origine dati sottostante e viceversa.

Quando la proprietà VirtualMode è impostata su True, è possibile creare l'interfaccia utente aggiungendo controlli dalla Casella degli strumenti anziché controlli associati dalla finestra Origini dati.

Gli eventi vengono generati per i singoli controlli ed è necessario aggiungere codice per gestire la visualizzazione dei dati. Quando si scorre nella visualizzazione un nuovo oggetto DataRepeaterItem, l'evento ItemValueNeeded viene generato una volta per ciascun controllo. È necessario fornire i valori per ciascun controllo nel gestore eventi ItemValueNeeded.

Se i dati di uno dei controlli vengono modificati dall'utente, viene generato l'evento ItemValuePushed ed è necessario convalidare i dati e salvarli nell'origine dati.

In caso di aggiunta di un nuovo elemento da parte dell'utente, viene generato l'evento NewItemNeeded. Utilizzare il gestore di questo evento per creare un nuovo record nell'origine dati. Per impedire che vengano apportate modifiche non intenzionali, è inoltre necessario monitorare l'evento KeyDown per ciascun controllo ed eseguire la chiamata a CancelEdit se viene premuto il tasto ESC.

Se l'origine dati viene modificata, è possibile aggiornare il controllo DataRepeater chiamando i metodi BeginResetTemplateItem e EndResetTemplateItem. È necessario chiamare i metodi nell'ordine specificato.

Infine, è necessario implementare gestori eventi per l'evento ItemsRemoved che si verifica quando un elemento viene eliminato e, facoltativamente, per gli eventi UserDeletingItems e UserDeletedItems che si verificano ogni volta che viene eliminato un elemento premendo il tasto CANC.

Implementazione della modalità virtuale

Di seguito sono riportati i passaggi necessari per l'implementazione della modalità virtuale.

Per implementare la modalità virtuale

  1. Trascinare un controllo DataRepeater dalla scheda Visual Basic Power Pack 1.1 della Casella degli strumenti a un form o un controllo contenitore. Impostare la proprietàVirtualModesu True.

  2. Trascinare i controlli dalla Casella degli strumenti all'area del modello di elemento (l'area superiore) del controllo DataRepeater. Sarà necessario un controllo per ciascun campo dell'origine dati che si desidera visualizzare.

  3. Implementare un gestore per l'evento ItemValueNeeded per fornire valori per ciascun controllo. L'evento viene generato quando si scorre nella visualizzazione un nuovo oggetto DataRepeaterItem. L'aspetto del codice sarà simile all'esempio seguente, che fa riferimento a un'origine dati denominata 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. Implementare un gestore per l'evento ItemValuePushed per archiviare i dati. L'evento viene generato quando si esegue il commit delle modifiche apportate a un controllo figlio di DataRepeaterItem. L'aspetto del codice sarà simile all'esempio seguente, che fa riferimento a un'origine dati denominata 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. Implementare un gestore per ciascun evento KeyDown del controllo figlio e monitorare il tasto ESC. Eseguire la chiamata al metodo CancelEdit per impedire che venga generato l'evento ItemValuePushed. L'aspetto del codice sarà simile all'esempio seguente.

    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. Implementare un gestore per l'evento NewItemNeeded. L'evento viene generato in caso di aggiunta di un nuovo elemento al controllo DataRepeater da parte dell'utente. L'aspetto del codice sarà simile all'esempio seguente, che fa riferimento a un'origine dati denominata 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. Implementare un gestore per l'evento ItemsRemoved. L'evento viene generato in caso di eliminazione di un elemento esistente da parte dell'utente. L'aspetto del codice sarà simile all'esempio seguente, che fa riferimento a un'origine dati denominata 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. Per la convalida a livello di controllo, è possibile implementare gestori per gli eventi Validating dei controlli figlio. L'aspetto del codice sarà simile all'esempio seguente.

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

Vedere anche

Riferimenti

ItemValuePushed

NewItemNeeded

ItemValueNeeded

Concetti

Introduzione al controllo DataRepeater (Visual Studio)