Вы можете использовать BindingList<object>
вместо List<object>
, например:
BindingList<object> bList = new BindingList<object>();
public MyClass()
{
}
private void button1_Click(object sender, EventArgs e)
{
bList.Add(new { Name = "Foo", Gender = "Bar" });
dataGridView1.DataSource = bList;
}
Проблема с вашим кодом заключается в том, что вы добавляете элемент в _list
, а затем передаете список какисточник данных сетки.В первый раз все отлично работает.В следующий раз это не сработает, потому что свойство DataGridView.DataSource
внутренне выполняет проверку, которая проверяет, равен ли переданный объект (или лучше равен ссылке) текущему, и в случае, если он ничего не делает.
BindingList<T>
работает, потому что он выставляет события (используемые сеткой), сообщая об изменении списка, поэтому в принципе вы также можете избежать передачи его в DataSource
каждый раз, кроме первого.
В качестве примечания я предлагаю вам использовать определенный класс (как показано в @ Alex answer ) вместо того, чтобы помещать анонимный класс в список object
.
Например, используя пользовательский класс, такой как Person
, вы можете передать пустой BindingList<Person>
в grid.DataSource
, а затем добавить другие Person
объекты без проблем.
Вместо этого вы не можете передать пустую BindingList<object>
в grid.DataSource
, потому что это приводит к сетке без столбцов и, следовательно, после того, как вы не можете добавить какие-либо элементы, имеющие общедоступные свойства (потому что публичные свойства превращаются вколонны).Таким образом, вам нужно передать BindingList<object>
хотя бы с одним определенным объектом, чтобы сетка могла понять, какими будут столбцы, и создать их.