1 pièce(s) jointe(s)
[C#] Comment accéder au formulaire dans un BackGroundWorker ?
Bonjour,
Je voudrais pendant le chargement assez long d'une fenetre MDI fille faire evoluer un progressbar dans la fenetre principale MDI parent.
La fenetre MDI fille charge à son démarrage un ensemble assez important de données via une base Oracle.
Code:
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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
/// <summary>
/// Ouvre la fenêtre FormRPS : Fenêtre contenant les données RPS.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
/// <remarks>La fenêtre fille MDI s'ouvre avec une instance unique.
/// Il est donc impossible d'ouvrir 2 FormRPS en même temps
</remarks>
private void taskItem1_Click(object sender, System.EventArgs e)
{
Activeprocessing(true);
backgroundWorker1.RunWorkerAsync();
Activeprocessing(false);
backgroundWorker1.CancelAsync();
} <------ Erreur Inter-Thread Ici
/// <summary>
/// Procédure d'ouverture d'une fenêtre MDI fille.
/// </summary>
/// <remarks>Si la fenêtre est déjà ouverte, alors cette fenêtre devient visible</remarks>
/// <param name="pFormName"></param>
/// <param name="pFormType"></param>
private void OpenUniqueForm(string pFormName,Form pFormType)
{
Form[] ChildrenForms = this.MdiChildren;
foreach (Form chform in ChildrenForms)
{
if (chform.Name== pFormName)
{
chform.Visible=true;
return ;
}
}
Form NewMdiChildForm = pFormType;
NewMdiChildForm.MdiParent=this;
NewMdiChildForm.Visible=true;
}
/// <summary>
/// Procédure indiquant un etat de traitement long de l'application
/// </summary>
/// <param name="pOnProcessing">Paramètre Booléan indiquant l'atat On/Off du processing</param>
private void Activeprocessing(bool pOnProcessing)
{
if (pOnProcessing)
{
Cursor.Hide();
progressBarWait.Enabled = true;
progressBarWait.Visible = true;
labelWait.Visible = true;
}
else
{
Cursor.Show();
progressBarWait.Enabled = false;
progressBarWait.Visible = false;
labelWait.Visible = false;
}
}
private void backgroundWorker1_ProgressChanged_1(object sender, ProgressChangedEventArgs e)
{
this.progressBarWait.Value = e.ProgressPercentage;
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
OpenUniqueForm("FormRps",new FormRps());
} |
Sauriez vous comment régler ce problème ?
vous pourrez voir un annexe l'erreur.
Merci d'avance pour votre aide
j'a iessayé avec ceci mais sans resultat : même erreur :
Code:
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
|
delegate void SafeOpenUniqueForm(string pFormName, Form pFormType);
/// <summary>
/// Procédure d'ouverture d'une fenêtre MDI fille.
/// </summary>
/// <remarks>Si la fenêtre est déjà ouverte, alors cette fenêtre devient visible</remarks>
/// <param name="pFormName"></param>
/// <param name="pFormType"></param>
private void OpenUniqueForm(string pFormName,Form pFormType)
{
Form[] ChildrenForms = this.MdiChildren;
foreach (Form chform in ChildrenForms)
{
if (chform.Name== pFormName)
{
chform.Visible=true;
return ;
}
}
Form NewMdiChildForm = pFormType;
if (NewMdiChildForm.InvokeRequired)
{
SafeOpenUniqueForm MyDelegate = new SafeOpenUniqueForm(OpenUniqueForm);
this.Invoke(MyDelegate, new object[] { pFormName, pFormType });
}
else
{
NewMdiChildForm.MdiParent = this;
NewMdiChildForm.Visible = true;
}
} |