Лучший способ обновить DataGridView при обновлении базового источника данных - программирование
Подтвердить что ты не робот

Лучший способ обновить DataGridView при обновлении базового источника данных

Каков наилучший способ обновления DataGridView при обновлении базового источника данных?

Я часто обновляю источник данных и хочу показать результат пользователю, как это происходит.

У меня есть что-то подобное (и оно работает), но обнуление DataGridView.DataSource не похоже на правильный путь.

List<ItemState> itemStates = new List<ItemState>();
dataGridView1.DataSource = itemStates;

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() });
    dataGridView1.DataSource = null;
    dataGridView1.DataSource = itemStates;
    System.Threading.Thread.Sleep(500);
}
4b9b3361

Ответ 1

Ну, это не намного лучше. Официально вы должны использовать

dataGridView1.DataSource = typeof(List); 
dataGridView1.DataSource = itemStates;

Он по-прежнему является "понятным/ reset источником", но мне еще предстоит найти что-нибудь еще, что бы надежно обновить источник данных DGV.

Ответ 2

Я столкнулся с этим сам. Моя рекомендация: если у вас есть права собственности на источник данных, не используйте List. Используйте BindingList. DataGridView автоматически обновится, когда эти события будут запущены.

Ответ 3

Observablecollection: представляет собой динамический набор данных, который предоставляет уведомления когда элементы добавляются, удаляются или когда весь список обновляется. Вы можете перечислить любую коллекцию, которая реализует интерфейс IEnumerable. Однако, чтобы настроить динамические привязки, чтобы вставки или удаления в  коллекция обновляет пользовательский интерфейс автоматически,  сбор должен реализовывать интерфейс INotifyCollectionChanged.  Этот интерфейс предоставляет событие CollectionChanged,  событие, которое должно возникать всякий раз, когда меняется базовая коллекция.

Observablecollection<ItemState> itemStates = new Observablecollection<ItemState>();

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() });
  }
 dataGridView1.DataSource = itemStates;

Ответ 4

В этом случае самым чистым, наиболее эффективным и приемлемым для парадигмы решением является использование 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 об этих добавлениях с той же строкой кода. Нет необходимости reset DataGridView DataSource при каждом изменении списка.

Также стоит упомянуть, что вы можете отбросить BindingSource на свою форму непосредственно в Visual Studio Forms Designer и прикрепить его как источник данных к вашему DataGridView, который сохранит вам строку кода в приведенном выше пример, где я делаю это вручную.

Ответ 5

Это копия моего ответа из ЭТО место.

Вам нужно снова заполнить datagrid следующим образом:

this.XXXTableAdapter.Fill(this.DataSet.XXX);

Если вы используете automaticlly connect из dataGridView, этот код автоматически создает в Form_Load()

Ответ 6

Вы устанавливаете источник данных внутри цикла и спящий 500 после каждого добавления. Почему бы просто не добавить элементы товара, а затем установить свой источник данных ПОСЛЕ того, как вы добавили все. Если вы хотите, чтобы поток спал после этого штрафа. Первый блок кода здесь - ваш второй модифицированный мной блок.

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() });
    dataGridView1.DataSource = null;
    dataGridView1.DataSource = itemStates;
    System.Threading.Thread.Sleep(500);
}

Измените свой код. Как показано ниже: это намного быстрее.

for (int i = 0; i < 10; i++) { 
    itemStates.Add(new ItemState { Id = i.ToString() });

}
    dataGridView1.DataSource = typeof(List); 
    dataGridView1.DataSource = itemStates;
    System.Threading.Thread.Sleep(500);

Ответ 7

Попробуйте этот код

List itemStates = new List();

for (int i = 0; i < 10; i++)
{ 
    itemStates.Add(new ItemState { Id = i.ToString() });
    dataGridView1.DataSource = itemStates;
    dataGridView1.DataBind();
    System.Threading.Thread.Sleep(500);
}