Bagikan melalui


Menavigasi data (Formulir Windows .NET)

Cara term mudah untuk menavigasi melalui rekaman di sumber data adalah dengan mengikat BindingSource komponen ke sumber data lalu mengikat kontrol ke BindingSource. Anda kemudian dapat menggunakan metode navigasi bawaan dari , seperti MoveNext, , MovePreviousMoveLast, dan MoveFirst.BindingSource Menggunakan metode ini akan menyesuaikan Position properti dan Current yang BindingSource tepat. Anda juga bisa menemukan rekaman dan mengaturnya sebagai rekaman saat ini dengan mengatur Position properti .

Untuk menaikkan posisi rekaman di sumber data

Atur Position properti BindingSource untuk data terikat Anda ke posisi rekaman untuk masuk ke posisi rekaman yang diperlukan. Contoh berikut mengilustrasikan menggunakan MoveNext metode BindingSource untuk menaikkan Position properti saat Anda memilih nextButton. dikaitkan BindingSource dengan Customers tabel himpunan Northwinddata .

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

Catatan

Position Mengatur properti ke nilai di luar rekaman pertama atau terakhir tidak mengakibatkan kesalahan, karena Formulir Windows tidak akan mengatur posisi ke nilai di luar batas daftar. Jika penting untuk mengetahui apakah Anda telah melewati rekaman pertama atau terakhir, sertakan logika untuk menguji apakah Anda akan melebihi jumlah elemen data.

Untuk memeriksa apakah Anda telah melebihi rekaman pertama atau terakhir

Membuat penanganan aktivitas untuk peristiwa PositionChanged. Di handler, Anda dapat menguji apakah nilai posisi yang diusulkan telah melebihi jumlah elemen data aktual.

Contoh berikut menggambarkan bagaimana Anda dapat menguji apakah Anda telah mencapai elemen data terakhir. Dalam contoh, jika Anda berada di elemen terakhir, tombol Berikutnya pada formulir dinonaktifkan.

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

Catatan

Ketahuilah bahwa, jika Anda mengubah daftar yang Anda navigasikan dalam kode, Anda harus mengaktifkan kembali tombol Berikutnya sehingga pengguna dapat menelusuri seluruh panjang daftar baru. Selain itu, ketahuilah bahwa peristiwa di atas PositionChanged untuk spesifik BindingSource yang Anda kerjakan perlu dikaitkan dengan metode penanganan peristiwanya.

Untuk menemukan rekaman dan mengaturnya sebagai item saat ini

Temukan catatan yang ingin Anda atur sebagai item saat ini. Find Gunakan metode seperti yang BindingSource ditunjukkan dalam contoh, jika sumber data Anda menerapkan IBindingList. Beberapa contoh sumber data yang menerapkan IBindingList adalah BindingList<T> dan 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

Untuk memastikan baris yang dipilih dalam tabel anak tetap berada pada posisi yang benar

Saat bekerja dengan pengikatan data di Formulir Windows, Anda akan menampilkan data dalam tampilan induk/anak atau master/detail. Ini adalah skenario pengikatan data di mana data dari sumber yang sama ditampilkan dalam dua kontrol. Mengubah pilihan dalam satu kontrol menyebabkan data yang ditampilkan di kontrol kedua berubah. Misalnya, kontrol pertama mungkin berisi daftar pelanggan dan daftar pesanan kedua yang terkait dengan pelanggan yang dipilih di kontrol pertama.

Saat menampilkan data dalam tampilan induk/anak, Anda mungkin harus mengambil langkah tambahan untuk memastikan bahwa baris yang saat ini dipilih dalam tabel anak tidak diatur ulang ke baris pertama tabel. Untuk melakukan ini, Anda harus menyimpan posisi tabel anak dan mengatur ulang setelah tabel induk berubah. Biasanya, reset tabel anak terjadi saat pertama kali bidang dalam baris tabel induk berubah.

Untuk menyimpan posisi tabel anak saat ini

  1. Deklarasikan variabel bilangan bulat untuk menyimpan posisi tabel anak dan variabel Boolean untuk menyimpan apakah akan menyimpan posisi tabel anak.

    private int cachedPosition = -1;
    private bool cacheChildPosition = true;
    
    Private cachedPosition As Integer = -1
    Private cacheChildPosition As Boolean = True
    
  2. ListChanged Tangani peristiwa untuk pengikatan CurrencyManager dan periksa ListChangedType dari Reset.

  3. Periksa posisi saat ini dari CurrencyManager. Jika lebih besar dari entri pertama dalam daftar (biasanya 0), simpan ke variabel.

    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. Tangani peristiwa daftar CurrentChanged induk untuk manajer mata uang induk. Di handler, atur nilai Boolean untuk menunjukkan bahwa itu bukan skenario penembolokan. CurrentChanged Jika terjadi, perubahan ke induk adalah perubahan posisi daftar dan bukan perubahan nilai item.

    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
    

Untuk mengatur ulang posisi tabel anak

  1. PositionChanged Tangani peristiwa untuk pengikatan CurrencyManagertabel anak .

  2. Atur ulang posisi tabel anak ke posisi cache yang disimpan dalam prosedur sebelumnya.

    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
    

Untuk menguji contoh kode, lakukan langkah-langkah berikut:

  1. Jalankan contoh.

  2. Pastikan kotak centang Cache dan reset posisi dipilih.

  3. Pilih tombol Hapus bidang induk untuk menyebabkan perubahan di bidang tabel induk. Perhatikan bahwa baris yang dipilih dalam tabel anak tidak berubah.

  4. Tutup dan jalankan ulang contoh. Anda perlu menjalankannya lagi karena perilaku reset hanya terjadi pada perubahan pertama di baris induk.

  5. Kosongkan kotak centang Cache dan atur ulang posisi .

  6. Pilih tombol Hapus bidang induk. Perhatikan bahwa baris yang dipilih dalam tabel anak berubah menjadi baris pertama.

Baca juga