2016-03-20 12 views
0

Mein Code, das funktioniert:WinForms Progress Bar Visible true false

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    progressBar1.Visible = true; 
} 

private void textBox2_TextChanged(object sender, EventArgs e) 
{ 
    progressBar1.Visible = false; 
} 

Wenn ich etwas für den Computer hinzufügen zu tun, wie im folgenden Codebeispiel zu sehen ist, wird der Computer nicht den Fortschrittsbalken zeigen, bis es fertig ist die Berechnung machen. Was ich will, ist, dass ich zuerst den Fortschrittsbalken zeige, dann die Berechnung mache und dann bei irgendeinem anderen Ereignis den Fortschrittsbalken ausblenden möchte. Warum kann ich das nicht so machen?

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    progressBar1.Visible = true; 
    FindPrimeNumber(50000); 
} 

private void textBox2_TextChanged(object sender, EventArgs e) 
{ 
    progressBar1.Visible = false; 
} 

Der FindPrimeNumber Code angefordert:

public int FindPrimeNumber(int n) 
{ 
    int count = 0; 
    int a = 2; 
    while (count < n) 
    { 
     int b = 2; 
     int prime = 1;// to check if found a prime 
     while (b * b <= a) 
     { 
      if (a % b == 0) 
      { 
       prime = 0; 
       break; 
      } 
      b++; 
     } 
     if (prime > 0) 
      count++; 
     a++; 
    } 
    return (--a); 
} 

der FindPrimeNumber Code ist nur etwas auf dem Computer eine Aufgabe für eine Weile zu tun zu machen, kann ich so testen, ob mein Fortschrittsbalken zu sehen, zeigen, wird sich .

+3

Das ist ziemlich einfach, Ihr UI-Thread kann die Fortschrittsleiste animieren * oder * es kann eine Primzahl finden. Es kann nicht beides. Verwenden Sie eine Aufgabe oder einen BackgroundWorker. –

+0

Können Sie bitte den Code für 'FindPrimeNumber' (und anderen Code, der für das, was Sie versuchen, relevant ist) zeigen? – Enigmativity

+0

Ich sehe Ihren Code, danke, aber wie schlagen Sie vor, Ihren Fortschrittsbalken zu aktualisieren? – Enigmativity

Antwort

0

Ich fand es heraus. In diesem Beispiel gibt ein Benutzer eine 5-stellige Nummer in einem Textfeld ein, dann wird ein Fortschrittsbalken in dem Formular angezeigt, während die Nummer in einer mathematischen Funktion verarbeitet wird. Anschließend wird das Ergebnis in ein zweites Textfeld und den Fortschrittsbalken eingegeben geht weg.

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    if (textBox1.TextLength == 5) 
    { 
     progressBar1.Visible = true; 
     int textFromTextBox1 = Int32.Parse(textBox1.Text); 
     backgroundWorker1.RunWorkerAsync(textFromTextBox1); 
    } 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    e.Result = FindPrimeNumber((int)e.Argument); 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    textBox2.Text = e.Result.ToString(); 
    backgroundWorker1.CancelAsync(); 
} 

private void textBox2_TextChanged(object sender, EventArgs e) 
{ 
    progressBar1.Visible = false; 
} 

Hinweis: Dieses Beispiel behandelt nicht alle Ausnahmen, aber es funktioniert gut. Wie Sie wahrscheinlich im Code sehen werden, übergebe ich einen Wert an den BackgroundWorker, der an die FindPrimeNumber-Methode übergeben wird, und erhalte das Ergebnis aus dem BackgroundWorker.

Weitere Hinweise für Anfänger:

Ich habe die Eigenschaft Background WorkerSupportsCancellation auf True gesetzt. Wenn Sie in WinForms den BackgroundWorker auf das Formular setzen, wird beim Doppelklicken der DoWorkEventHandler für Sie generiert, dann im Solution Explorer zu den Events und doppelklicken Sie auf RunWorkerCompleted, damit es für Sie generiert werden kann auch. Andernfalls müssen Sie viel manuelle Codeeingabe vornehmen.