2010-01-07 5 views
0

J'ai une requête SQL qui renvoie des centaines de lignes, et je dois les ajouter à un DataGrid WinForms d'une manière qui permette toujours à l'utilisateur d'afficher/faire défiler le DataGrid car les lignes sont ajoutée.Mise à jour de DataGrid dans BackgroundWorker Thread

Actuellement, j'utilise un thread BackgroundWorker pour exécuter l'instruction SQL et faire une boucle dans les lignes d'un DataReader, avant d'utiliser Control.BeginInvoke pour renvoyer chaque nouvelle ligne dans le thread d'interface utilisateur où il est ajouté au DataTable lié au DataGrid. Cela n'a pas vraiment l'effet désiré (il faut un peu de temps pour mettre à jour le DataGrid, puis après une mise à jour, l'interface utilisateur ne répond plus).

Existe-t-il un moyen de faire ce que je veux, et si oui, comment? Edit: J'ai ajouté un thread.sleep au thread de travail lors de la boucle dans le lecteur de données, ce qui empêche l'interface utilisateur de ne plus répondre après la première mise à jour, mais il n'est toujours pas aussi réactif que je le souhaite. (le défilement est un peu nerveux car l'ajout d'une ligne dans le fil de l'interface utilisateur semble voler la mise au point).

Répondre

1

Avez-vous regardé le mode virtuel pour les contrôles DataGridView? Il peut offrir un moyen d'itérer seulement les lignes que vous devez voir (c'est-à-dire obtenir seulement des données lorsque l'utilisateur fait défiler).

Voir: http://msdn.microsoft.com/en-us/library/ms171622.aspx

PS: DataGrid est vieux, essayer DataGridView :)

+0

Je vais y jeter un coup d'oeil maintenant. Merci pour la réponse rapide :) –

+0

Cela a fonctionné très bien, merci! –

0

Actuellement, je suis sur un fil BackgroundWorker pour exécuter l'instruction SQL et boucle à travers les lignes dans un DataReader, avant d'utiliser Control.BeginInvoke pour transmettre chaque nouvelle ligne au thread de l'interface utilisateur où est ajouté au DataTable lié au DataGrid.

Il semble que vous utilisiez Dispatcher pour mettre à jour l'interface utilisateur. Ce n'est pas une bonne idée. L'utilisation de DataGrid dans un environnement multithread est compliquée. J'ai publié un modèle ici. Il couvre une approche possible sur l'utilisation de DataGrid dans une configuration multithread.

http://www.codeproject.com/Articles/1086714/A-Template-For-Using-Datagrid-in-Monitoring-UI

Questions connexes