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 Northwind
data .
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
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
ListChanged Tangani peristiwa untuk pengikatan CurrencyManager dan periksa ListChangedType dari Reset.
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
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
PositionChanged Tangani peristiwa untuk pengikatan CurrencyManagertabel anak .
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:
Jalankan contoh.
Pastikan kotak centang Cache dan reset posisi dipilih.
Pilih tombol Hapus bidang induk untuk menyebabkan perubahan di bidang tabel induk. Perhatikan bahwa baris yang dipilih dalam tabel anak tidak berubah.
Tutup dan jalankan ulang contoh. Anda perlu menjalankannya lagi karena perilaku reset hanya terjadi pada perubahan pertama di baris induk.
Kosongkan kotak centang Cache dan atur ulang posisi .
Pilih tombol Hapus bidang induk. Perhatikan bahwa baris yang dipilih dalam tabel anak berubah menjadi baris pertama.
Baca juga
.NET Desktop feedback