Esplorare i dati (Windows Form .NET)

Il modo più semplice per spostarsi tra i record in un'origine dati consiste nell'associare un BindingSource componente all'origine dati e quindi associare i controlli a BindingSource. È quindi possibile usare il metodo di spostamento predefinito di BindingSource, ad esempio MoveNext, MoveLastMovePrevious, e MoveFirst. L'uso di questi metodi regola le Position proprietà e Current dell'oggetto BindingSource in modo appropriato. È anche possibile trovare un record e impostarlo come record corrente impostando la Position proprietà .

Per incrementare la posizione del record in un'origine dati

Impostare la Position proprietà dell'oggetto BindingSource per i dati associati sulla posizione del record per passare alla posizione del record richiesta. Nell'esempio seguente viene illustrato l'utilizzo del MoveNext metodo di BindingSource per incrementare la Position proprietà quando si seleziona .nextButton L'oggetto BindingSource è associato alla Customers tabella di un set di dati Northwind.

private void nextButton_Click(object sender, System.EventArgs e)
{
    this.customersBindingSource.MoveNext();
}
Private Sub nextButton_Click(ByVal sender As Object,
    ByVal e As System.EventArgs) Handles nextButton.Click
    Me.customersBindingSource.MoveNext()
End Sub

Nota

L'impostazione della Position proprietà su un valore superiore al primo o all'ultimo record non genera un errore, perché Windows Form non imposta la posizione su un valore esterno ai limiti dell'elenco. Se è importante sapere se è passato il primo o l'ultimo record, includere la logica per verificare se si supererà il numero di elementi dati.

Per verificare se è stato superato il primo o l'ultimo record

Creare un gestore eventi per l'evento PositionChanged. Nel gestore è possibile verificare se il valore della posizione proposta ha superato il conteggio effettivo degli elementi dati.

L'esempio seguente illustra come verificare se è stato raggiunto l'ultimo elemento dati. Nell'esempio, se si è all'ultimo elemento, il pulsante Avanti nel modulo è disabilitato.

void customersBindingSource_PositionChanged(object sender, EventArgs e)
{
    if (customersBindingSource.Position == customersBindingSource.Count - 1)
        nextButton.Enabled = false;
    else
        nextButton.Enabled = true;
}
Sub customersBindingSource_PositionChanged(ByVal sender As Object,
    ByVal e As EventArgs)

    If customersBindingSource.Position =
        customersBindingSource.Count - 1 Then
        nextButton.Enabled = False
    Else
        nextButton.Enabled = True
    End If
End Sub

Nota

Tenere presente che, se si modifica l'elenco nel codice, è necessario riabilitare il pulsante Avanti in modo che gli utenti possano esplorare l'intera lunghezza del nuovo elenco. Tenere inoltre presente che l'evento precedente PositionChanged per l'evento specifico BindingSource con cui si sta lavorando deve essere associato al relativo metodo di gestione degli eventi.

Per trovare un record e impostarlo come elemento corrente

Trovare il record che si desidera impostare come elemento corrente. Usare il Find metodo di BindingSource come illustrato nell'esempio, se l'origine dati implementa IBindingList. Alcuni esempi di origini dati che implementano IBindingList sono BindingList<T> e DataView.

void findButton_Click(object sender, EventArgs e)
{
    int foundIndex = customersBindingSource.Find("CustomerID", "ANTON");
    customersBindingSource.Position = foundIndex;
}
Sub findButton_Click(ByVal sender As Object, ByVal e As EventArgs) _
    Handles findButton.Click
    Dim foundIndex As Integer = customersBindingSource.Find("CustomerID",
        "ANTON")
    customersBindingSource.Position = foundIndex
End Sub

Per assicurarsi che la riga selezionata in una tabella figlio rimanga nella posizione corretta

Quando si usa il data binding in Windows Form, i dati verranno visualizzati in una visualizzazione padre/figlio o master/dettagli. Si tratta di uno scenario di data binding in cui i dati della stessa origine vengono visualizzati in due controlli. Se si modifica la selezione in un controllo, automaticamente vengono modificati anche i dati visualizzati nel secondo controllo. Ad esempio, il primo controllo può contenere un elenco di clienti e il secondo un elenco di ordini correlati al cliente selezionato nel primo controllo.

Quando si visualizzano dati in una visualizzazione padre/figlio, potrebbe essere necessario eseguire passaggi aggiuntivi per assicurarsi che la riga attualmente selezionata nella tabella figlio non venga reimpostata sulla prima riga della tabella. A tale scopo, sarà necessario memorizzare nella cache la posizione della tabella figlio e reimpostarla dopo la modifica della tabella padre. In genere, la reimpostazione della tabella figlio viene eseguita la prima volta che viene modificato un campo in una riga della tabella padre.

Per memorizzare nella cache la posizione corrente della tabella figlio

  1. Dichiarare una variabile integer per archiviare la posizione della tabella figlio e una variabile booleana per archiviare se memorizzare nella cache la posizione della tabella figlio.

    private int cachedPosition = -1;
    private bool cacheChildPosition = true;
    
    Private cachedPosition As Integer = -1
    Private cacheChildPosition As Boolean = True
    
  2. Gestire l'evento ListChanged per l'oggetto CurrencyManager dell'associazione e individuare un oggetto ListChangedType di Reset.

  3. Controllare la posizione corrente dell'oggetto CurrencyManager. Se è maggiore della prima voce nell'elenco (in genere 0), salvarla in una variabile.

    void relatedCM_ListChanged(object sender, ListChangedEventArgs e)
    {
        // Check to see if this is a caching situation.
        if (cacheChildPosition && cachePositionCheckBox.Checked)
        {
            // If so, check to see if it is a reset situation, and the current
            // position is greater than zero.
            CurrencyManager relatedCM = sender as CurrencyManager;
            if (e.ListChangedType == ListChangedType.Reset && relatedCM.Position > 0)
    
                // If so, cache the position of the child table.
                cachedPosition = relatedCM.Position;
        }
    }
    
    Private Sub relatedCM_ListChanged(ByVal sender As Object,
        ByVal e As ListChangedEventArgs)
        ' Check to see if this is a caching situation.
        If cacheChildPosition AndAlso cachePositionCheckBox.Checked Then
            ' If so, check to see if it is a reset situation, and the current
            ' position is greater than zero.
            Dim relatedCM As CurrencyManager = sender
            If e.ListChangedType = ListChangedType.Reset _
                AndAlso relatedCM.Position > 0 Then
    
                ' If so, cache the position of the child table.
                cachedPosition = relatedCM.Position
            End If
        End If
    
    End Sub
    
  4. Gestire l'evento CurrentChanged dell'elenco padre per l'oggetto CurrencyManager padre. Nel gestore impostare il valore booleano per indicare che non è uno scenario di memorizzazione nella cache. Se si verifica l'evento CurrentChanged, la modifica all'elemento padre sarà una modifica alla posizione dell'elenco e non una modifica al valore dell'elemento.

    void bindingSource1_CurrentChanged(object sender, EventArgs e)
    {
        // If the CurrentChanged event occurs, this is not a caching
        // situation.
        cacheChildPosition = false;
    }
    
    ' Handle the current changed event. This event occurs when
    ' the current item is changed, but not when a field of the current
    ' item is changed.
    Private Sub bindingSource1_CurrentChanged(ByVal sender As Object,
        ByVal e As EventArgs) Handles bindingSource1.CurrentChanged
        ' If the CurrentChanged event occurs, this is not a caching 
        ' situation.
        cacheChildPosition = False
    
    End Sub
    

Per reimpostare la posizione della tabella figlio

  1. Gestire l'evento PositionChanged per l'associazione della tabella figlio.CurrencyManager

  2. Reimpostare la posizione della tabella figlio sulla posizione memorizzata nella cache salvata nella procedura precedente.

    void relatedCM_PositionChanged(object sender, EventArgs e)
    {
        // Check to see if this is a caching situation.
        if (cacheChildPosition && cachePositionCheckBox.Checked)
        {
            CurrencyManager relatedCM = sender as CurrencyManager;
    
            // If so, check to see if the current position is
            // not equal to the cached position and the cached
            // position is not out of bounds.
            if (relatedCM.Position != cachedPosition && cachedPosition
                > 0 && cachedPosition < relatedCM.Count)
            {
                relatedCM.Position = cachedPosition;
                cachedPosition = -1;
            }
        }
    }
    
    Private Sub relatedCM_PositionChanged(ByVal sender As Object, ByVal e As EventArgs)
        ' Check to see if this is a caching situation.
        If cacheChildPosition AndAlso cachePositionCheckBox.Checked Then
            Dim relatedCM As CurrencyManager = sender
    
            ' If so, check to see if the current position is 
            ' not equal to the cached position and the cached 
            ' position is not out of bounds.
            If relatedCM.Position <> cachedPosition AndAlso
                cachedPosition > 0 AndAlso cachedPosition <
                relatedCM.Count Then
                relatedCM.Position = cachedPosition
                cachedPosition = -1
            End If
        End If
    End Sub
    

Per testare l'esempio di codice, eseguire la procedura seguente:

  1. Eseguire l'esempio.

  2. Verificare che la casella di controllo Cache and reset position (Cache and reset position ) sia selezionata.

  3. Selezionare il pulsante Cancella campo padre per causare una modifica in un campo della tabella padre. Si noti che la riga selezionata nella tabella figlio non cambia.

  4. Chiudere ed eseguire di nuovo l'esempio. È necessario eseguirlo di nuovo perché il comportamento di reimpostazione si verifica solo alla prima modifica nella riga padre.

  5. Deselezionare la casella di controllo Cache and reset position (Cache and reset position ).

  6. Selezionare il pulsante Cancella campo padre. Notare che la riga selezionata nella tabella figlio diventa la prima riga.

Vedi anche