Salut,
Une application charge un Dataset à partir d'une base de données Access sur un disque distant. C'est long donc je veux que l'utilisateur soit averti que l'appli n'est pas bloquée.
J'ai créé une fenêtre dans laquelle j'ai une icône, un bouton cancel etc ... Bref, j'ai fais une dialogbox (une form en showdialog) de téléchargement.
A l'ouverture la DialogBox lance un backgroundworker pour traiter les données puis se ferme une fois le backgroundworker achevé ou le cancel effectué.
C'est ici que ça se corse. J'essaye de recharger la base de données dans le DataSet (parce qu'un autre utilisateur aurait modifié la MDB par exemple).
Lorsque je re-fill les tables, je reçois le message suivant :
En cherchant j'ai déterminé que mon problème vient du fait que mon re-fill se fait dans un autre thread.L'exception suivante s'est produite dans le DataGridView :
System.IndexOutOdRangeException: L'index 0 n'a pas de valeur.
à System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
à System.Windows.Forms.DataGridViewDataConnection.GetError(Int32 rowIndex)
...
J'ai donc mis le tout dans un invoke comme ceci :
Cela fonctionne presque. Je n'ai plus le message d'erreur, mais maintenant c'est ma dialogbox qui semble gelée. La dialogbox s'ouvre, mais tous ses controles sont blancs. Probablement parce que l'UI n'est plus sur la dialogbox à cause du invoke. Mais comment faire pour résoudre ce problème ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 this.Invoke(new MethodInvoker(delegate() { this.GlobalDataSet.Clear(); this.entetePointTableAdapter.Fill(this.GlobalDataSet.EntetePoint); this.groupeTableAdapter.Fill(this.GlobalDataSet.Groupe); this.parcelleGroupeTableAdapter.Fill(this.GlobalDataSet.ParcelleGroupe); this.parcelleTableAdapter.Fill(this.GlobalDataSet.Parcelle); this.ligneTableAdapter.Fill(this.GlobalDataSet.Ligne); this.pointTableAdapter.Fill(this.GlobalDataSet.Point); this.pCodeTableAdapter.Fill(this.GlobalDataSet.PCode); this.GlobalDataSet.Groupe.IdGroupeColumn.AutoIncrementSeed = (long)groupeTableAdapter.MaxIdGroupe() + 1; } ) );
Merci de vos z'avis z'avisés,
JM
Partager