web-dev-qa-db-fra.com

Meilleur moyen d'actualiser DataGridView lorsque vous mettez à jour la source de données de base

Quel est le meilleur moyen d'actualiser un DataGridView lorsque vous mettez à jour la source de données de base?

Je mets à jour fréquemment la source de données et je voulais afficher le résultat à l'utilisateur au fur et à mesure.

J'ai fait quelque chose comme ça (et ça marche), mais annuler le DataGridView.DataSource ne semble pas être la bonne solution.

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);
}
51
shaunf

Eh bien, ça ne va pas beaucoup mieux que ça. Officiellement, vous devriez utiliser

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

C'est toujours un type de solution "effacer/réinitialiser la source", mais je n'ai encore rien trouvé qui puisse actualiser de manière fiable la source de données DGV.

47
Alan

Je suis tombé dessus moi-même. Ma recommandation: Si vous êtes propriétaire de la source de données, n'utilisez pas un List . Utilisez un BindingList . Le BindingList a des événements qui se déclenchent lorsque des éléments sont ajoutés ou modifiés, et le DataGridView se met automatiquement à jour lorsque ces événements sont déclenchés. 

45
GWLlosa

La solution la plus propre, la plus efficace et la plus adaptée aux paradigmes consiste à utiliser un System.Windows.Forms.BindingSource comme proxy entre votre liste d'éléments (source de données) et votre DataGridView:

var itemStates = new List<ItemState>();
var bindingSource1 = new System.Windows.Forms.BindingSource { DataSource = itemStates };
dataGridView1.DataSource = bindingSource1;

Ensuite, lors de l'ajout d'éléments, utilisez la méthode Add() de BindingSource au lieu de la méthode Add() de votre liste:

for (var i = 0; i < 10; i++)
{
    bindingSource1.Add(new ItemState { Id = i.ToString() });
    System.Threading.Thread.Sleep(500);
}

De cette façon, vous ajoutez des éléments à votre liste et notifiez DataGridView de ces ajouts avec la même ligne de code. Inutile de réinitialiser le nom DataGridView pour DataSource chaque fois que vous modifiez la liste.

Il est également intéressant de noter que vous pouvez déposer un BindingSource sur votre formulaire directement dans le Forms Designer de Visual Studio et l'attacher comme source de données à votre DataGridView également, ce qui vous permet d'économiser une ligne de code dans l'exemple ci-dessus où je le fais. manuellement.

12
Alexander Abakumov

Observablecollection : représente une collection de données dynamique qui fournit des notifications Lorsque des éléments sont ajoutés, supprimés ou lorsque toute la liste est actualisée . Vous pouvez énumérer toute collection qui implémente l'interface IEnumerable. Cependant, pour configurer des liaisons dynamiques afin que des insertions ou des suppressions dans le fichier collection mettre à jour l'interface utilisateur automatiquement, la collection doit implémenter l'interface INotifyCollectionChanged . Cette interface expose l'événement CollectionChanged, un événement qui devrait être déclenché chaque fois que la collection sous-jacente change.

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

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

Ceci est une copie de ma réponse de THIS place.

Il suffit de remplir à nouveau la grille de données comme ceci:

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

Si vous utilisez automaticlly connect depuis dataGridView, ce code est créé automatiquement en Form_Load ().

0
starko