Udostępnij za pośrednictwem


Nawigowanie po danych (Windows Forms .NET)

Najprostszym sposobem nawigowania po rekordach w źródle danych jest powiązanie BindingSource składnika ze źródłem danych, a następnie powiązanie kontrolek z elementem BindingSource. Następnie możesz użyć wbudowanej metody nawigacji elementu BindingSource, takiego jak MoveNext, MoveLast, MovePreviousi MoveFirst. Użycie tych metod dostosuje Position właściwości BindingSource i Current odpowiednio. Możesz również znaleźć rekord i ustawić go jako bieżący rekord, ustawiając Position właściwość .

Aby zwiększać położenie rekordu w źródle danych

Position Ustaw właściwość dla powiązanych BindingSource danych na pozycję rekordu, aby przejść do wymaganej pozycji rekordu. Poniższy przykład ilustruje użycie MoveNext metody BindingSource , aby zwiększać Position właściwość po wybraniu nextButtonelementu . Element BindingSource jest skojarzony z tabelą Customers zestawu danych 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

Uwaga

Position Ustawienie właściwości na wartość spoza pierwszego lub ostatniego rekordu nie powoduje błędu, ponieważ formularze systemu Windows nie ustawią pozycji na wartość spoza granic listy. Jeśli ważne jest, aby wiedzieć, czy minęło pierwszy lub ostatni rekord, dołącz logikę do przetestowania, czy przekroczysz liczbę elementów danych.

Aby sprawdzić, czy przekroczono pierwszy lub ostatni rekord

Utwórz procedurę obsługi zdarzeń dla PositionChanged zdarzenia. W procedurze obsługi można sprawdzić, czy proponowana wartość pozycji przekroczyła rzeczywistą liczbę elementów danych.

W poniższym przykładzie pokazano, jak można sprawdzić, czy osiągnięto ostatni element danych. W tym przykładzie, jeśli jesteś w ostatnim elemecie, przycisk Dalej w formularzu jest wyłączony.

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

Uwaga

Należy pamiętać, że jeśli zmienisz listę, którą przechodzisz w kodzie, ponownie włącz przycisk Dalej , aby użytkownicy mogli przeglądać całą długość nowej listy. Ponadto należy pamiętać, że powyższe PositionChanged zdarzenie dla określonego BindingSource , z którym pracujesz, musi być skojarzone z metodą obsługi zdarzeń.

Aby znaleźć rekord i ustawić go jako bieżący element

Znajdź rekord, który chcesz ustawić jako bieżący element. Find Użyj metody , BindingSource jak pokazano w przykładzie, jeśli źródło danych implementuje IBindingListelement . Niektóre przykłady źródeł danych, które implementują IBindingList , to BindingList<T> i 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

Aby upewnić się, że zaznaczony wiersz w tabeli podrzędnej pozostaje w prawidłowej pozycji

Podczas pracy z powiązaniem danych w formularzach Systemu Windows dane będą wyświetlane w widoku nadrzędnym/podrzędnym lub głównym/szczegółowym. Jest to scenariusz powiązania danych, w którym dane z tego samego źródła są wyświetlane w dwóch kontrolkach. Zmiana zaznaczenia w jednej kontrolce powoduje zmianę danych wyświetlanych w drugiej kontrolce. Na przykład pierwsza kontrolka może zawierać listę klientów, a drugą listę zamówień związanych z wybranym klientem w pierwszej kontrolce.

Podczas wyświetlania danych w widoku nadrzędnym/podrzędnym może być konieczne wykonanie dodatkowych kroków, aby upewnić się, że aktualnie wybrany wiersz w tabeli podrzędnej nie zostanie zresetowany do pierwszego wiersza tabeli. Aby to zrobić, należy buforować położenie tabeli podrzędnej i zresetować ją po zmianie tabeli nadrzędnej. Zazwyczaj resetowanie tabeli podrzędnej odbywa się po raz pierwszy po zmianie pola w wierszu tabeli nadrzędnej.

Aby buforować bieżące położenie tabeli podrzędnej

  1. Zadeklaruj zmienną całkowitą do przechowywania położenia tabeli podrzędnej i zmiennej logicznej w celu przechowywania, czy buforować położenie tabeli podrzędnej.

    private int cachedPosition = -1;
    private bool cacheChildPosition = true;
    
    Private cachedPosition As Integer = -1
    Private cacheChildPosition As Boolean = True
    
  2. ListChanged Obsłuż zdarzenie dla powiązania CurrencyManager i sprawdź, czy element ma ListChangedType element Reset.

  3. Sprawdź bieżące położenie elementu CurrencyManager. Jeśli jest on większy niż pierwszy wpis na liście (zazwyczaj 0), zapisz go w zmiennej.

    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. Obsługa zdarzenia listy CurrentChanged nadrzędnej dla nadrzędnego menedżera waluty. W procedurze obsługi ustaw wartość logiczną, aby wskazać, że nie jest to scenariusz buforowania. W takim CurrentChanged przypadku zmiana elementu nadrzędnego jest zmianą położenia listy, a nie zmianą wartości elementu.

    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
    

Aby zresetować położenie tabeli podrzędnej

  1. PositionChanged Obsłuż zdarzenie dla powiązania tabeli podrzędnej CurrencyManager.

  2. Zresetuj położenie tabeli podrzędnej do pozycji buforowanej zapisanej w poprzedniej procedurze.

    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
    

Aby przetestować przykładowy kod, wykonaj następujące kroki:

  1. Uruchom przykład.

  2. Upewnij się, że pole wyboru Pamięć podręczna i pozycja resetowania jest zaznaczone.

  3. Wybierz przycisk Wyczyść pole nadrzędne, aby spowodować zmianę w polu tabeli nadrzędnej. Zwróć uwagę, że wybrany wiersz w tabeli podrzędnej nie zmienia się.

  4. Zamknij i uruchom ponownie przykład. Należy uruchomić go ponownie, ponieważ zachowanie resetowania występuje tylko w przypadku pierwszej zmiany w wierszu nadrzędnym.

  5. Wyczyść pole wyboru Pamięć podręczna i pozycję resetowania.

  6. Wybierz przycisk Wyczyść pole nadrzędne. Zwróć uwagę, że zaznaczony wiersz w tabeli podrzędnej zmienia się na pierwszy wiersz.

Zobacz też