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
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.
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.
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; } } }
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; } }
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(); } }
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; }
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); }
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; } }