Aracılığıyla paylaş


Verilerde gezinme

Veri kaynağındaki kayıtlarda gezinmenin en kolay yolu, bir BindingSource bileşenini veri kaynağına bağlamak ve ardından denetimleri BindingSourcebağlamaktır. Daha sonra BindingSourceyerleşik gezinti yöntemini kullanabilirsiniz. Örneğin, MoveNext, MoveLast, MovePreviousve MoveFirst. Bu yöntemlerin kullanılması, Position'nin Current ve BindingSource özelliklerini uygun şekilde ayarlar. Ayrıca, Position özelliğini ayarlayarak bir kaydı bulabilir ve geçerli kayıt olarak ayarlayabilirsiniz.

Veri kaynağındaki kayıt konumunu artırmak için

Bağlı verileriniz için gerekli kayıt konumuna gitmek amacıyla, Position için BindingSource özelliğini hedef kayıt konumuna ayarlayın. Aşağıdaki örnekte, MoveNextseçtiğinizde BindingSource özelliğini artırmak için PositionnextButton yönteminin kullanılması gösterilmektedir. BindingSource, Customersbir veri kümesinin Northwind tablosuyla ilişkilendirilir.

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

Uyarı

Position özelliğinin ilk veya son kaydın ötesinde bir değere ayarlanması hataya neden olmaz, çünkü Windows Forms konumu listenin sınırları dışındaki bir değere ayarlamaz. İlk kaydı mı yoksa son kaydı mı geçtiğinizi bilmek önemliyse, veri öğesi sayısını aşıp aşmayabileceğinizi test etmek için mantık ekleyin.

İlk kaydı mı yoksa son kaydı mı aştığınızı denetlemek için

PositionChanged olayı için bir olay işleyicisi oluşturun. İşleyicide, önerilen konum değerinin gerçek veri öğesi sayısını aşıp aşmadığını test edebilirsiniz.

Aşağıdaki örnekte, son veri öğesine ulaşıp ulaşmadığınız nasıl test edilebileceği gösterilmektedir. Örnekte, son öğedeyseniz formdaki İleri düğmesi devre dışı bırakılır.

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

Uyarı

Kodda gezindiğiniz listeyi değiştirirseniz, kullanıcıların yeni listenin tüm uzunluğuna göz atabilmesi için sonraki düğmesini yeniden etkinleştirmeniz gerektiğini unutmayın. Ayrıca, üzerinde çalıştığınız belirli PositionChanged için yukarıdaki BindingSource olayının olay işleme yöntemiyle ilişkilendirilmesi gerektiğini unutmayın.

Bir kaydı bulup mevcut öğe olarak ayarlamak için

Geçerli öğe olarak ayarlamak istediğiniz kaydı bulun. Veri kaynağınız Find'yi uyguluyorsa, örnekte gösterildiği gibi BindingSource'in IBindingList yöntemini kullanın. IBindingList uygulayan veri kaynaklarına örnek olarak BindingList<T> ve DataViewverilebilir.

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

Çocuk tablodaki seçilen satırın doğru konumda kalmasını sağlamak için

Windows Forms'da veri bağlamayla çalışırken, verileri üst/alt öğe veya ana/ayrıntı görünümünde görüntülersiniz. Bu, aynı kaynaktaki verilerin iki denetimde görüntülendiği bir veri bağlama senaryosudur. Bir denetimde seçimin değiştirilmesi, ikinci denetimde görüntülenen verilerin değişmesine neden olur. Örneğin, ilk denetim bir müşteri listesi, ikincisi ise ilk denetimde seçili müşteriyle ilgili siparişlerin listesini içerebilir.

Verileri ebeveyn/çocuk görünümünde görüntülerken, alt tabloda seçili olan satırın tablonun ilk satırına sıfırlanmasını önlemek için ek adımlar atmanız gerekebilir. Bunu yapmak için, alt tablo konumunu önbelleğe alıp üst tablo değiştiğinde sıfırlamanız gerekir. Genellikle alt tablo sıfırlama, üst tablonun bir satırındaki alan ilk kez değiştiğinde gerçekleşir.

Geçerli alt tablo konumunu önbelleğe almak için

  1. Alt tablo konumunu depolamak için bir tamsayı değişkeni ve alt tablo konumunun önbelleğe alınıp alınmayacağını depolamak için bir Boole değişkeni bildirin.

    private int cachedPosition = -1;
    private bool cacheChildPosition = true;
    
    Private cachedPosition As Integer = -1
    Private cacheChildPosition As Boolean = True
    
  2. Bağlamanın ListChanged'i için CurrencyManager olayını işleyin ve ListChangedType'ün Reset'yi kontrol edin.

  3. CurrencyManagermevcut konumunu kontrol edin. Listedeki ilk girdiden (genellikle 0) büyükse, bunu bir değişkene kaydedin.

    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. Üst para birimi yöneticisi için üst listenin CurrentChanged olayını işleyin. İşleyicide Boole değerini önbelleğe alma senaryosu olmadığını gösterecek şekilde ayarlayın. CurrentChanged oluşursa, ebeveyndeki değişiklik, öğe değeri değişikliği değil, bir liste konumu değişikliğidir.

    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
    

Çocuk tablo konumunu sıfırlamak için

  1. Alt tablo bağlamasının PositionChangediçin CurrencyManager olayını işle.

  2. Alt tablo konumunu, önceki işlemde kaydedilen önbelleğe alınmış konuma sıfırlayın.

    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
    

Kod örneğini test etmek için aşağıdaki adımları uygulayın:

  1. Örneği çalıştırın.

  2. Önbelleğin ve konumun sıfırlanması için onay kutusunun seçili olduğundan emin olun.

  3. Ebeveyn tablonun bir alanında değişikliğe neden olmak için Ebeveyn alanı temizle düğmesini seçin. Çocuk tablodaki seçili satırın değişmediğine dikkat edin.

  4. Örneği kapatın ve yeniden çalıştırın. Sıfırlama davranışı yalnızca üst satırdaki ilk değişiklikte gerçekleştiğinden yeniden çalıştırmanız gerekir.

  5. Önbelleği temizleyin ve konum sıfırlama onay kutusunu işaretleyin.

  6. Ana alanı temizle düğmesini seçin. Çocuk tablosundaki seçili satırın ilk satıra değiştiğini fark edin.

Ayrıca bakınız