Bonjour
Je vous explique déjà le fonctionnement voulu, je travail en c# avec visual studio 2010 .NET 4.0
J'ai un Form1 principal, dans lequel j'ai certaine donnée, et j'ai un bouton "Valider" pour enregistrer des données, jusque là, rien de bien compliqué.
Là ou sa se complique, c'est que quand j'appuie sur le bouton valider, j'ai un texte qui s'inscrit "en attente"..., et je doit avoir une boucle (ou une tache...) qui se lance afin de vérifier toutes les 1 secondes que la fonction check() retourne TRUE, et que tant que cette fonction n'est pas à TRUE, le formulaire est en attente, il n'enregistre rien, et dès que la fonction est à TRUE, ca enregistre le formulaire, éventuellement dans ce formulaire je pourrai avoir un bouton pour annuler cette boucle de recherche...
Bon dans un premier temps j'ai essayé un simple while(check()) directement dans le Form1, évidemment cela gèle tout mon formulaire, mais bon je me devais d'essayer :p
J'ai donc vue qu'on pouvais utiliser un Background Worker, donc j'ai créé une class Background_Worker que j'appel quand j'appuie sur le bouton "Valider" de mon Form1, dans ce Background Worker je met ce qui va bien, mais là ou sa ne fonctionne pas, c'est dans la fonction bw_RunWorkerCompleted(), j’essaie d'appeler la fonction qui enregistre les données de mon Form1, par exemple
Form1.save();
ou encore
Form1 form = new Form1();
form.save();
Le problème, c'est que sa n'enregistre rien, en fait au lieu d'utiliser le Form1 d'origine, j'ai l'impression qu'il en créé un nouveau vide, et qu'il essais de l'enregistrer!
A savoir que je ne suis pas fermer à d'autre proposition si vous pensez qu'il y a une façon plus simple de faire qu'avec un Background Worker...
Je vous n'affiche pas le vrai code car il est énorme, je vous affiche plutôt un code pour comprendre facilement comment j'essais de m'y prendre
J'ai ajouté l'option needCheck, en fait quand je désactive cette fonction sa enregistre direct le formulaire, et ceci fonctionne bien.
Form1.cs
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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 namespace TEST { public partial class Form1 : Form { private void buttonValider_Click(object sender, RoutedEventArgs e) { if (needCheck) save1(); else save3(); } private void save1() { label1.text = "En attente de validation..."; Background_Worker bw = new Background_Worker(); bw.start(); } public void save2() { /* Ici je fait certain traitement que je veux faire seulement quand needCheck est activé, puis je lance save3 pour enregistrer */ save3(); } private void save3() { /* Ici j'enregistre mes données */ } } }
Background_Worker.cs
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
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 namespace TEST { class Background_Worker { private BackgroundWorker bw = new BackgroundWorker(); public Page() { bw.WorkerReportsProgress = false; bw.WorkerSupportsCancellation = true; bw.DoWork += new DoWorkEventHandler(bw_DoWork); bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); } public void start(object sender, RoutedEventArgs e) { if (bw.IsBusy != true) { bw.RunWorkerAsync(); } } private void bw_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; while(!check()) Thread.Sleep(1000); } private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { Form1 form = new Form1(); form.save2(); /* Si ici je met un messageBox, elle s'affiche bien */ } } }
Voilà, j'espère m'avoir bien exprimé, car parfois je suis tellement dans le projet que j'ai l'impression d'être clair, alors que je ne le suis pas du tout
Merci d'avance pour la lecture, et éventuellement pour vos suggestions![]()
Partager