2017-07-26 1 views
0
  1. Je travaille en studio visuel (version 2010).
  2. J'essaie de configurer une barre de progression sous une forme (espace de noms et classe différents) en fonction des variables d'un autre espace de noms et classe. La variable ProgressPerc que vous voyez dans le code provient d'une autre classe (que j'ai déjà indiquée avec 'OtherNameSpace'.)
  3. Il me dit que je ne peux pas convertir ProgressPerc en int (car je ne peux pas convertir type tot int).

Quelle serait ici la solution la plus optimale, je voudrais utiliser cette variable pour indiquer la progression des simulationsBarre de progression utilisant un fond d'écran entre deux classes différentes

EDIT:.. ajouté le code ALMBerekeningen Ceci est juste une petite partie de celui-ci, le code complet est trop pour montrer ici

Merci!


public class ALMBerekeningen 
{ 
    public int sim; 
    public int Progress; 
    public double ProgressPerc; 

    this.ProgressPerc = this.sim/1000; 
    this.Progress = (int)Math.Round(this.Progress * 100f, 0, MidpointRounding.AwayFromZero); 
} 

Public class Form1: Form 
{ 
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 

     ALMBerekeningen ProgressPerc; 

     int sims; 

     sims = (int)ProgressPerc; 

     try 
     { 
      backgroundWorker1.ReportProgress(sims); 
     } 

     catch (Exception ex) 
     { 
      backgroundWorker1.CancelAsync(); 
      MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     progressBar1.Value = e.ProgressPercentage; 
     lblProgress.Text = "Completed " + progressBar1.Value.ToString() + " %"; 
     progressBar1.Update(); 
    } 
} 
+0

@Mong Zhu J'ai ajouté une partie du code. this.sim est changé dans ALMBerekeningen et passe de 1 à 1000. – RobinL

Répondre

1

Vous devez passer dans le cas de ALMBerekeningen au travailleur de fond lorsque vous démarrez et accéder ensuite à l'aide de la propriété DoWorkEventArgs.Argument dans le gestionnaire d'événements:

public void Main() 
{ 
    //The instance of the class with the variable for your progress bar 
    ALMBerekeningen almBerekeningen = new ALMBerekeningen(); 

    BackgroundWorker bgw = new BackgroundWorker(); 
    bgw.DoWork += bgw_DoWork; 

    //Pass your class instance in here 
    bgw.RunWorkerAsync(almBerekeningen); 
} 


private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 

    //e.Argument is the instance of the class you passed in 
    var progressPerc = (ALMBerekeningen)e.Argument; 

    int sims; 

    sims = progressPerc.ProgressPerc; 

    try 
    { 
     backgroundWorker1.ReportProgress(sims); 
    } 

    catch (Exception ex) 
    { 
     backgroundWorker1.CancelAsync(); 
     MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

Soit dit en passant, votre DoWork comme indiqué ne s'exécutera qu'une seule fois. Je présume que vous venez de le simplifier pour l'exemple.

+0

Peut-être aussi vaut la peine de noter que le bloc 'catch' copié est loin d'être idéal. – vasek

+0

"Vous devez passer dans l'instance d'ALMBerekeningen à l'arrière-plan", vous n'avez pas vraiment besoin de faire cela, cela fonctionnerait aussi s'il s'agit d'un simple champ dans la classe 'Form'. –