Ikat Kamus Ke DataGridView dengan pembaruan rutin

Saya punya Dictionary (Of long, Class). Kelas memiliki banyak properti. Dan saya ingin melihat data Kamus ini di DataGridView. Jadi, Cukup saya menggunakan:

DataGridView1.DataSource = Dictionary.Values.ToArray

Sekarang, properti di dalam objek Kelas untuk rekaman di dalam Kamus terus diperbarui (terlalu sering). Dan saya ingin mencerminkan pembaruan ini ke DataGridView secara langsung.

Saya yakin menggunakan DataGridView1.DataSource = Dictionary.Values.ToArray setiap kali bukanlah cara yang efisien dan akan memakan banyak daya pemrosesan. Bagaimana saya bisa membuat Kamus Dapat Diikat (seperti di DataTables misalnya)? Saya memerlukan ini di VB.NET, saya mencoba menggunakan Linq untuk menyelesaikan ini (Ditemukan di sini https://stackoverflow.com/a/855954/2546348) Namun tetap saja, saya tidak melihat pembaruan baru hadir di DataGridView.

Ada saran? Pendekatan apa yang terbaik untuk menerapkan hal ini?


person Ahmad Musa    schedule 11.11.2019    source sumber
comment
Apa yang Anda gunakan, WPF atau WinForms?   -  person Pavel Anikhouski    schedule 11.11.2019
comment
Maaf tidak menyebutkan itu di postingan, WinForms.   -  person Ahmad Musa    schedule 11.11.2019
comment
Objek kelas Anda harus mengimplementasikan INotifyPropertyChanged. Setelah selesai, Anda dapat mengikat [Dictionary].Values Anda ke BindingSource, lalu mengikat DGV ke BindingSource (mengatur .DataSource = [TheBindingSource] DGV). Setiap perubahan pada nilai-nilai Kamus akan segera tercermin dalam DGV.   -  person Jimi    schedule 11.11.2019
comment
Terima kasih, @Jimi Solusi Anda bekerja dengan sangat baik. Satu pertanyaan lagi muncul di benak saya. Sekarang bagaimana melakukan hal yang sama tetapi ketika item baru ditambahkan ke Kamus atau dihapus darinya? Apakah ada pemberitahuan serupa yang dapat dimunculkan agar sumber data diperbarui berdasarkan item terbaru (penambahan dan penghapusan Kamus) tanpa menugaskan Sumber Data untuk DGV lagi... Saya menghargai bantuan Anda.   -  person Ahmad Musa    schedule 12.11.2019
comment
Tidak secara langsung. Meskipun ValueCollection yang diekspos oleh [Dictionary].Values tidak statis (referensi ValueCollection yang mendasarinya akan diperbarui saat Anda menambah/menghapus ke/dari Kamus), itu tidak memunculkan pemberitahuan perubahan daftar (sebenarnya ada cara, tapi saya tidak akan melakukannya menyarankan apapun :). Anda dapat: 1) Menambahkan Item baru ke BindingSource (objek TValue, dengan BindingSource.Add([object])), menyinkronkan Kamus bila diperlukan. 2) Buat kelas Anda sendiri yang mewarisi Kamus‹TKey, TValue› dan mengimplementasikan antarmuka IBindingList. 3) Gunakan DataTable alih-alih Kamus   -  person Jimi    schedule 12.11.2019
comment
Pada poin 2), implementasi kustom dapat memberikan respons default dalam kasus normal, menggunakan metode default implementasi Dictionary<TKey, TValue>, namun memberikan bentuk ValueCollection sendiri saat terikat data, melalui metode IBindingList dan metodenya. daftar pemberitahuan yang diubah secara umum dipahami/ditafsirkan.   -  person Jimi    schedule 12.11.2019
comment
Sekali lagi terima kasih @Jimi. Ketika Anda mengatakannya (saya tidak akan menyarankan apa pun). Apakah maksud Anda saya bisa menggunakan kedua cara tersebut? Atau Anda tidak memilih untuk menggunakannya karena beberapa masalah/kekurangan yang diketahui saat menggunakannya? Saya pikir solusi 1 mungkin yang paling mudah. Namun akan tertarik melihat contoh saran (2) jika ada dan tidak keberatan. Terbaik :)   -  person Ahmad Musa    schedule 13.11.2019
comment
Dan BTW @Jimi. Saya sarankan Anda memberikan komentar pertama Anda sebagai jawaban untuk dipilih sebagai jawaban yang benar karena itu membantu saya dalam masalah pertama saya di posting...   -  person Ahmad Musa    schedule 13.11.2019


Jawaban (1)


Berkat komentar @ jimi, saya menggunakan properti notify untuk mencapai ini... Tapi saya perlu memberikan jawaban untuk pertanyaan ini:

Objek kelas Anda harus mengimplementasikan INotifyPropertyChanged. Setelah selesai, Anda dapat mengikat [Dictionary].Values Anda ke BindingSource, lalu mengikat DGV ke BindingSource (mengatur .DataSource = [TheBindingSource] DGV). Setiap perubahan pada nilai-nilai Kamus akan segera tercermin dalam DGV.

person Ahmad Musa    schedule 04.04.2020