Самое чистое, эффективное и дружественное для парадигмы решение в этом случае заключается в использовании System.Windows.Forms.BindingSource
в качестве прокси между вашим списком элементов (источником данных) и вашим DataGridView
:
var itemStates = new List<ItemState>();
var bindingSource1 = new System.Windows.Forms.BindingSource { DataSource = itemStates };
dataGridView1.DataSource = bindingSource1;
Затем, при добавлении элементов, используйте Add()
метод BindingSource
вместо метода Add()
вашего списка:
for (var i = 0; i < 10; i++)
{
bindingSource1.Add(new ItemState { Id = i.ToString() });
System.Threading.Thread.Sleep(500);
}
Таким образом, вы добавляете элементы в свой список и уведомляете DataGridView
об этих дополнениях с той же строкой кода. Нет необходимости сбрасывать DataGridView
DataSource
каждый раз, когда вы вносите изменения в список.
Стоит также упомянуть, что вы можете поместить BindingSource
на форму непосредственно в конструкторе форм Visual Studio и присоединить ее в качестве источника данных к вашему DataGridView
, что сохранит вам строку кода в приведенном выше пример, где я делаю это вручную.