عندي حصة دراسية
class Person{
public string Name {get; set;}
public string Surname {get; set;}
}
و List<Person>
التي أضيف إليها بعض العناصر. القائمة مرتبطة بـ 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;
لا توجد مشكلة. myGrid
يعرض صفين ، لكن عندما أقوم بإضافة عناصر جديدة إلى قائمة persons
، myGrid
لا يعرض قائمة محدّثة جديدة. إنه يظهر فقط الصفين اللذين أضفتهما من قبل.
فما هي المشكلة؟
اللف في كل مرة يعمل بشكل جيد. ولكن عندما أقوم بربط DataTable
بالشبكة ، في كل مرة أقوم فيها بإجراء بعض التغييرات على DataTable
، ليست هناك حاجة إلى ReBind myGrid
.
كيف يمكن حلها دون إعادة اللف في كل مرة؟
لا تطبق القائمة IBindingList
حتى لا تعرف الشبكة عن العناصر الجديدة.
ربط DataGridView الخاص بك إلى BindingList<T>
بدلاً من ذلك.
var list = new BindingList<Person>(persons);
myGrid.DataSource = list;
لكنني سأذهب أبعد وأربط شبكتك بـ BindingSource
var list = new List<Person>()
{
new Person { Name = "Joe", },
new Person { Name = "Misha", },
};
var bindingList = new BindingList<Person>(list);
var source = new BindingSource(bindingList, null);
grid.DataSource = source;
في كل مرة تضيف عنصرًا جديدًا إلى القائمة ، ستحتاج إلى إعادة ربط الشبكة الخاصة بك. شيء مثل:
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;
نعم ، من الممكن القيام بإعادة التصفية عن طريق تطبيق واجهة INotifyPropertyChanged.
مثال بسيط جدا متاح هنا ،
http://msdn.Microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
بعد إضافة عنصر جديد إلى persons
، أضف:
myGrid.DataSource = null;
myGrid.DataSource = persons;