-
ProgressBar pendant SQL
Bonjour,
J'ai un bouton qui lance une commande Sql via ODBC pour remplir deux datagridview :
Me.SectArtTableAdapter.FillBy(Me.DataSet1.SectArt, atc)
Me.CLIARTTableAdapter.FillBy38(Me.DataSet1.CLIART, atc, client)
Mon problème est que c'est une requête très longue (env 1 minute) et je voudrais que ma progressbar s'anime pendant la requête.
J'ai essayé plusieurs méthodes mais sans succès.
Merci de votre aide.
-
Je sais pas ce que ca peut donner mais j'essaierait ca :
une requete pour connaitre le nombre d'éléments dans ta table (SELECT COUNT) puis execution de la requete avec en parallèle un thread qui compte toute les secondes le nombre de lignes de tes gridview.
-
Si tu es en framework 2.0, tu peux utiliser un backgroundworker. (lier ton traitement long à ton backgroundworker et mettre à jour ta progressbar depuis ce dernier) c'est plus facile que ca en à l'air
Si tu n'es pas en framework deux... tu as le choix d'utiliser les thread, les méthodes callback. C'est moin évident
Dans tous les cas, les solutions que je te propose sont des solutions asynchrones. Il doit exister d'autres solutions encore
-
Ok B Lob,merci ,j 'ai essayé , mais avec le backgroundworker lorsque le thread est lancé, mes datagridview ne se remplissent pas (alors qu'ils le sont si le code n'est pas executé par le Backgroundworker).
Mon code est peut-être incomplet :
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
client = Me.ClientsDataGridView.CurrentRow.Cells(0).Value
atc = Me.AtcComboBox.SelectedValue
Dim atcETclient() As String = {atc, client}
BackgroundWorker1.RunWorkerAsync(atcETclient)
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Me.SectArtTableAdapter.FillBy(Me.DataSet1.SectArt, e.Argument(0))
Me.CLIARTTableAdapter.FillBy38(Me.DataSet1.CLIART, e.Argument(0), e.Argument(1))
End Sub
PS: j'ai testé les e.arguments par msgbox, ils contiennent bien les bonnes valeurs ...
-
J'ai testé et rencontre le même probème que toi (et je travaille en C#)
bref, je n'avais pas utilisé le backgroundworker pour ce genre de traitement et pour que ca marche, j'ai du forcer la propriété DataSource de mon datagridview sur la table voulue lors du backgroundworker.RunWorkerCompleted
Est ce que cette solution te convient ?
-
Ca ne marche toujours pas : la requête est executée (durée detraitement similaire à une requête sans Backgrounworker) mais les datagridview restent désespérémént vides ...
Pourrais-tu poster le code qui fonctionne chez toi ?
Merci d'avance ,
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Me.SectArtTableAdapter.FillBy(Me.DataSet1.SectArt, e.Argument(0))
Me.CLIARTTableAdapter.FillBy38(Me.DataSet1.CLIART, e.Argument(0), e.Argument(1))
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As System.Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
MsgBox("ok")
Me.CLIARTDataGridView.DataSource = ClientsBindingSource
Me.SectArtDataGridView.DataSource = SectArtBindingSource
End Sub
Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
End Sub
-
J'avais lié directement la datatable à mon datagridview... En testant tout comme toi par le bindingSource, ca ne marche pas.
J'ai ajouté cette commande dans le RunWorkerCompleted
"BindingSource".ResetBindings(false);
et là ca marche...
Je pense que c'est un probème d'opérations inter thread. J'ai testé de faire ce même traitement avec des thread et çà fait la même chose..