it-swarm.asia

قائمة الربط <T> إلى DataGridView في WinForm

عندي حصة دراسية

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.

كيف يمكن حلها دون إعادة اللف في كل مرة؟

77
namco

لا تطبق القائمة 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;
153
Jürgen Steinblock

في كل مرة تضيف عنصرًا جديدًا إلى القائمة ، ستحتاج إلى إعادة ربط الشبكة الخاصة بك. شيء مثل:

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;
3
Dimitar Dimitrov

نعم ، من الممكن القيام بإعادة التصفية عن طريق تطبيق واجهة INotifyPropertyChanged.

مثال بسيط جدا متاح هنا ،

http://msdn.Microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

1
Dev

بعد إضافة عنصر جديد إلى persons ، أضف:

myGrid.DataSource = null;
myGrid.DataSource = persons;
1
Rafal