saya ada kelas
class Person{
public string Name {get; set;}
public string Surname {get; set;}
}
dan a List<Person>
yang saya tambahkan beberapa item. Daftar ini terikat pada saya DataGridView
.
List<Person> persons = new List<Person>();
persons.Add(new Person(){Name="Joe", Surname="Black"});
persons.Add(new Person(){Name="Misha", Surname="Kozlov"});
myGrid.DataSource = persons;
Tidak ada masalah. myGrid
menampilkan dua baris, tetapi ketika saya menambahkan item baru ke persons
daftar saya , myGrid
tidak menampilkan daftar baru yang diperbarui. Ini hanya menunjukkan dua baris yang saya tambahkan sebelumnya.
Jadi apa masalahnya?
Rebinding setiap kali bekerja dengan baik. Tapi ketika saya mengikat DataTable
ke grid ketika setiap kali saya membuat beberapa perubahan DataTable
tidak ada kebutuhan untuk ReBind myGrid
.
Bagaimana mengatasinya tanpa rebinding setiap saat?
One
cara ist untuk menggunakan BindingList, yang akan memunculkan acara jika daftar yang mendasarinya berubah. Cara lain adalah dengan menggunakanBindingSource
dan memanggil ResetBinding () setiap kali Anda menambah / menghapus baris tetapi itu lebih banyak pekerjaan. Jika Anda ingin memberi tahu Grid tentang perubahan properti, cara termudah adalah mengimplementasikannyaINotifyPropertyChanged
List<T>
jika Anda mau. Tetapi jika Anda secara programatik menambahkan item ke Daftar, DataGridView tidak akan mengetahuinya karena Daftar Anda tidak mengimplikasikanIBindingList
. Mengenai BindingSource: Saya sering menggunakan winforms, dan saya tidak mengikat apa pun selain BindingSource - FULLSTOP. Menambahkan lebih banyak detail terlalu banyak untuk sebuah komentar, tetapiBindingSource
memiliki begitu banyak hal yang ditawarkan tanpa kerugian apa pun. Saya akan melangkah lebih jauh dan berkataAnyone who does not use a BindingSource for binding has not fully understood windows forms databindings
BindingSource
sebagai jembatan antara sumber data dan GUI Anda. Ini memecahkan banyak masalah terkait penyatuan data. Anda ingin memuat ulang data Anda? Cukup aturbindingSource.DataSource
ke koleksi baru Anda alih-alih menyatukan kembali setiap kontrol. DataSource Anda bisa nihil? SetbindingSource.DataSource = typeof(YourClass)
Anda ingin memiliki kisi yang dapat diedit tetapi sumber data Anda tidak memiliki konstruktor tanpa parameter? Cukup terapkanbindingSource.AddingNew
acara dan buat objek sendiri. Saya tidak pernah mengalami kerugian saat menggunakanBindingSource
tetapi banyak manfaatnya.Setiap kali Anda menambahkan elemen baru ke Daftar, Anda perlu mengikat kembali Grid Anda. Sesuatu seperti:
List<Person> persons = new List<Person>(); persons.Add(new Person() { Name = "Joe", Surname = "Black" }); persons.Add(new Person() { Name = "Misha", Surname = "Kozlov" }); dataGridView1.DataSource = persons; // added a new item persons.Add(new Person() { Name = "John", Surname = "Doe" }); // bind to the updated source dataGridView1.DataSource = persons;
sumber
Ya, itu mungkin dilakukan tanpa rebinding dengan mengimplementasikan INotifyPropertyChanged Interface.
Contoh Pretty Simple tersedia di sini,
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
sumber
INotifyPropertyChanged
DataGridView akan menampilkan semua perubahan properti yang terjadi di latar belakang, tetapi tidak akan tahu apakah Anda menambahkan / menghapus baris dari sumber Anda. Untuk tujuan ini, terdapatIBindingList
antarmuka dan, untuk kenyamanan Anda,BindingList<T>
implementasi yang sudah mengimplementasikannya, tetapi tidak mendukung penyortiran / pemfilteran.Setelah menambahkan item baru untuk
persons
ditambahkan:myGrid.DataSource = null; myGrid.DataSource = persons;
sumber
null
jika Anda segera menetapkannyapersons
di baris berikutnya?Ini bukan masalah yang saya alami, tetapi jika ada yang ingin mengonversi BindingList jenis apa pun ke List dengan jenis yang sama, maka beginilah cara melakukannya:
var list = bindingList.ToDynamicList();
Selain itu, jika Anda menetapkan BindingLists tipe dinamis ke DataGridView.DataSource, pastikan Anda mendeklarasikannya terlebih dahulu sebagai IBindingList sehingga cara di atas berfungsi.
sumber