Bonjour,
J'ai utilisé un thread pour remplir une datagridview, mais ceci engendre le blocage de l'ascenseur du DataGridView :cry:
Est ce que vous pouvez m'aider ? :calim2:
Merci
Version imprimable
Bonjour,
J'ai utilisé un thread pour remplir une datagridview, mais ceci engendre le blocage de l'ascenseur du DataGridView :cry:
Est ce que vous pouvez m'aider ? :calim2:
Merci
Slt
C'est bizarre que ca te bloque la scrollbar. Ca te le bloque pendant le chargement ou une fois terminer?
++
rien d'anormal en fait.
créer des threads c'est bien, mais bien gérer les intéractions avec l'UI c'est mieux.
il faut savoir que les threads n'ont pas le droit d'intervenir sur les winforms, enfin sur les contrôles fenêtrés.
Ainsi un thread n'a pas le droit de venir perturber le déroulement de l'interface graphique et il n'a donc pas le droit de venir modifier les propriétés des divers contrôles fenêtrés.
voici un exemple de code qui permet de gérer ce problème de cross-threading.
dans ta form où se situe ta DGV :
et dans ton threadCode:
1
2
3
4
5
6
7
8
9
10
11
12 Public Delegate Sub Proc(ByVal sender As Object, ByVal e As DataTable) Public Sub FillDGV(ByVal invoker As Object, ByVal dt As DataTable) If invoker Is Nothing Then Me.Invoke(New Proc(AddressOf FillDGV), Me, dt) Else Me.DGV.SuspendLayout() Me.DGV.DataSource = dt ' ici tu défini les colonnes visibles et invisible, celles qui sont readonly ou pas si certaines sont en écritures et pas d'autres... Me.DGV.ResumeLayout() End If End Sub
Code:
1
2
3
4
5
6
7 ... Dim dt = New DataTable ' ta boucle pour remplir la dt plutôt que de remplir directement la datagridview MyForm.FillDGV(Nothing, dt)
Merci Monsieur, je vais essayer ca :D :ccool:
est ce que ton thread à bien rempli le dataset et la bien fourni à la méthode remplissage synchronisée dans le thread UI ?
c'est la question à ce poser, n'hésite pas à provoquer sciemment des exception (throw new) dans un contexte ou l'autre pour voir ou ce situe le problème, ou mettre des points d'arrêts et bien faire ton débogage...
donc fait ton débogage en 2 phases
tout d'abord tu débogue dans le contexte du thread, pour cela les points d'arrets/exceptions tu les met dans le threads et éventuellement dans la méthode d'interfaçage exécutée par le thread pour savoir si justement il fourni bien le dataset.
ensuite tu place les points d'arret dans le contexte UI et la vérifie que cette meme méthode synchronisée, recoit bien le dataset, et surtout qu'elle remplie bien la Datagrid
Bonjour,
En fait il y a pas des exception qui se lance mais je crois que le DataTable n'est pas rempli a la fin du programme.
La question c est comment remplir la variable dt.
Merci
je t'ai déjà expliqué, tout le secret se passe dans le passage des paramètres.
tu construit ton datatable dans un thread, qui fait sa soupe à lui pour remplir le datatable... sql, webservices, opération du saint esprit, ce que tu veux.
ensuite tu transmet dans une méthode sur le formulaire où se trouve le datagridview, le datatable qui va servir de source de données de binding.
le problème c'est que pour l'instant tu l'a envoyé dans le meme contexte que le thread qui a rempli le DT...
ce thread n'est pas le thread UI, et n'a donc pas le meme contexte, il est donc interdit d'écrire dans la DGV directement depuis ce thread tierce, cette même méthode va donc se synchroniser dans le bon thread.
c'est pour cela qu'elle à un profil du genre
si tu respecte les conventions d'appel, c'est à dire l'appeler depuis ton thread avec Form1.DGVFill(this, dt)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 DGVFill(object sender, DataTable dt) { if (sender == null) { // Remplissage du DGV DGV.DataSource = dt; // Customisation du DGV et des différentes colonnes DGV.Columns(0).Visible = 0; // si ta première colonne est une clé } else this.Invoke(DGVFill, null, dt); }
(en VB Form1.DGVFill(Me, dt)
elle va alors dans le contexte du thread vérifier que le sender est null, pour supposer qu'elle est dans le contexte du thread UI, si sender est différent de null, elle considère qu'elle est dans un contexte de thread séparé, elle va donc se synchroniser en s'appelant elle même, DANS le contexte du thread UI qui est le seul autorisé à pouvoir écrire dans la DGV directement...
maintenant tu peux toujours m'envoyer un zip avec l'archive de ton projet et me dire où ca se situe que je regarde, ou juste avec les 3 fichiers concernés (le fichier avec le thread) et les deux fichiers avec la form ou ce situe la DGV (la form + le code behind) et je regarderai