Erstellen Sie einen Fortschrittsbalken in C#

Syed Hassan Sabeeh Kazmi 15 Februar 2024
  1. Erstellen einer Fortschrittsanzeige in der Windows Forms-App (.NET Framework)
  2. Erstellen Sie einen Fortschrittsbalken mit der Klasse BackgroundWorker in C#
  3. Erstellen Sie einen Fortschrittsbalken mit Text in C#
Erstellen Sie einen Fortschrittsbalken in C#

Langwierige Dateioperationen und Berechnungen erfordern Fortschrittsanzeigen, und ein Fortschrittsbalken ist die beste Möglichkeit, dem Benutzer Fortschrittsinformationen während einer lang andauernden Operation anzuzeigen. In diesem Tutorial erfahren Sie, wie Sie mit Visual Studio 2022 drei verschiedene Fortschrittsbalken in C# erstellen.

Ein dynamischer Fortschrittsbalken in C# verfügt über zwei Eigenschaften, um seinen Bereich anzugeben (Eigenschaften Maximum und Minimum), die hauptsächlich der Anzahl der zu kopierenden Dateien oder auszuführenden Prozesse entsprechen. Wenn ein Prozess abgeschlossen ist und um den Wert des Fortschrittsbalkens zu erhöhen, wird außerdem die Eigenschaft Step mit der Methode PerformStep verwendet.

Ein vorgefertigter Fortschrittsbalken in C# kann nur horizontal ausgerichtet werden; Sie können jedoch einen benutzerdefinierten Fortschrittsbalken erstellen, der Ihren Anforderungen entspricht. Der Hauptzweck einer Fortschrittsleiste besteht darin, den Benutzer über den Fortschritt aktuell ausgeführter Aufgaben durch eine C#-Anwendung zu informieren.

Erstellen einer Fortschrittsanzeige in der Windows Forms-App (.NET Framework)

Ein Fortschrittsbalken fungiert als Element der Benutzeroberfläche, das den Fortschritt eines Vorgangs anzeigt. Ein Fortschrittsbalken in C# unterstützt zwei Modi, die den Fortschritt darstellen: unbestimmt und kontinuierlich.

Der unbestimmte Modus für den Fortschrittsbalken ist praktisch, wenn Sie eine Aufgabe oder Operation ausführen, von der Sie nicht wissen, wie lange sie dauern wird. Dies geschieht durch das asynchrone Laden von Daten in einen Hintergrund-Thread (im Allgemeinen mit Hilfe der Klasse BackgroundWorker), während die C#-Anwendung noch auf den Benutzer reagiert.

Es ist ein gängiges Designparadigma, einen unbestimmten Fortschrittsbalken anzuzeigen, während Daten geladen werden, und wird gesetzt, bis der tatsächliche Fortschritt beginnt. Beim Erstellen eines Fortschrittsbalkens in WinForms ist es wichtig, die Eigenschaft Style des Fortschrittsbalkens auf Marquee zu setzen.

Ein Fortschrittsbalken in WPM hat jedoch die Eigenschaft Isdeterminate, die ähnlich ist wie Style, und sein Wert als True funktioniert ähnlich wie Marquee.

// namespaces for C# windows application (.NET Framework)

using System;
using System.Windows.Forms;

namespace ProgressBarExp {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    // create a `progressBar1` progress bar in your C# project design
    private void progressBar1_Click(object sender, EventArgs e) {}

    // create a method that performs some calculations
    // the progress bar will synch with this method and progress accordingly
    private void Caluculate(int i) {
      // perform a task
    }

    // create a `RunOperation` button to perform calculations or take action in your C# project
    // design
    private void RunOperation_Click(object sender, EventArgs e) {
      // set the visibility of progress bar
      progressBar1.Visible = true;

      for (int j = 0; j < 10000001; j++) {
        Caluculate(j);
        if (j == 10000000) {
          MessageBox.Show("Operation Complete!");
          progressBar1.Visible = false;
        }
      }
    }
    private void Form1_Load(object sender, EventArgs e) {
      // for indeterminate progress using .NET framework
      progressBar1.Style = ProgressBarStyle.Marquee;

      progressBar1.Visible = false;
    }
  }
}

Ausgang:

C#-Fortschrittsbalken in Windows Forms – Ausgabe 1

Ein Fortschrittsbalken erfüllt seinen Zweck nur dann richtig, wenn er den Fortschritt beim Laden Ihrer Daten anzeigt. In C#-Anwendungen sind Fortschrittsbalken beliebt, um Software zu installieren, langwierige Aufgaben auszuführen und zu starten, damit die Benutzer genau wissen, wie viel Zeit ein Prozess dauern wird und wie viel Fortschritt noch verbleibt.

Um einen kontinuierlichen Fortschrittsbalken in C# zu erstellen, entfernen Sie den Code aus dem Ereignis RunOperation_Click und ersetzen Sie ihn durch den folgenden Code:

private void RunOperation_Click(object sender, EventArgs e) {
  progressBar1.Visible = true;
  progressBar1.Maximum = 10000000;
  progressBar1.Value = 1;

  for (int j = 0; j < 10000001; j++) {
    Caluculate(j);

    if (progressBar1.Value == 10000000) {
      MessageBox.Show("Operation Complete!");
      progressBar1.Visible = false;
      break;
    }

    // it will measure the progress of the task or operations and progress in regards to the
    // completion of a task It only requires if the progress bar style is not set to Marquee
    progressBar1.PerformStep();
  }
}

Ausgang:

C#-Fortschrittsbalken in Windows Forms – Ausgabe 2

Kommentieren Sie im Ereignis Form1_Load das progressBar1.Style = ProgressBarStyle.Marquee; Zeile aus dem C#-Code, und Sie haben einen kontinuierlichen Fortschrittsbalken entsprechend dem Prozentsatz der Aufgabenerfüllung %.

Erstellen Sie einen Fortschrittsbalken mit der Klasse BackgroundWorker in C#

Es muss klar sein, wie einfach es ist, einen Fortschrittsbalken in C#-Anwendungen zu verwenden. Jetzt ist es an der Zeit zu untersuchen, wie sich ein Fortschrittsbalken vorwärts bewegt, indem er mit tatsächlicher Arbeit synchronisiert wird und nicht nur mit einem statischen Wert.

Die meisten neuen C#-Entwickler geraten in Schwierigkeiten, wenn sie feststellen, dass Sie nicht gleichzeitig eine Aufgabe ausführen und einen Fortschrittsbalken im selben Thread aktualisieren können. Wenn Sie eine schwere Aufgabe im Benutzeroberflächen-Thread einer C#-Anwendung ausführen und versuchen, den Fortschrittsbalken entsprechend zu aktualisieren, benötigen Sie die Dienste einer BackgroundWorker-Klasse in C#.

Ohne die Hilfe der Klasse BackgroundWorker, die einen Fortschrittsbalken ziemlich nutzlos macht. Der Fortschrittsbalken zeigt keine Aktualisierung des Fortschritts an, bevor eine Aufgabe erfolgreich abgeschlossen wurde, und erfordert, dass ein Hintergrundarbeiter beide in einem einzigen Thread gleichzeitig aktualisiert.

Es ist eine ideale Möglichkeit, einen Fortschrittsbalken mit einem Hintergrund zu erstellen, der in C# arbeitet, um eine Aufgabe in einem Worker-Thread auszuführen und dann die Aktualisierung an den Benutzeroberflächen-Thread zu pushen, der den Fortschrittsbalken sofort aktualisiert und diese Aktualisierungen anzeigt.

using System;
using System.Windows;
using System.Threading;
using System.Windows.Forms;
using System.ComponentModel;

namespace ProgressBarExp {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    // create a progress bar in your C# project's Form1.cs [Design]
    private void progressBar1_Click(object sender, EventArgs e) {}

    // a button to perform an operation synched with the `progressBar1`
    private void RunOperation_Click(object sender, EventArgs e) {
      BackgroundWorker taskSynch = new BackgroundWorker();
      taskSynch.WorkerReportsProgress = true;
      taskSynch.DoWork += taskSynch_DoWork;
      taskSynch.ProgressChanged += taskSynch_ProgressChanged;
      taskSynch.RunWorkerAsync();
    }

    // Form1 load event
    private void Form1_Load(object sender, EventArgs e) {}

    // create a method that connects `BackgroundWorker` with a task
    void taskSynch_DoWork(object sender, DoWorkEventArgs e) {
      for (int i = 0; i < 100; i++) {
        (sender as BackgroundWorker).ReportProgress(i);
        Thread.Sleep(100);
      }
    }

    // create a method that connects a task with the `progressBar1`
    void taskSynch_ProgressChanged(object sender, ProgressChangedEventArgs e) {
      progressBar1.Value = e.ProgressPercentage;
    }
  }
}

Ausgang:

C#-Fortschrittsbalken mit BackgroundWorker – Ausgabe

Erstellen Sie einen Fortschrittsbalken mit Text in C#

Im Allgemeinen können Sie einen benutzerdefinierten Fortschrittsbalken erstellen, der Ihnen mehr Kontrolle über seine Konfiguration gibt. Einen C#-Code von Grund auf neu zu schreiben, um einen Fortschrittsbalken zu erstellen, ist jedoch langwierig; Sie können NuGet-Pakete wie Syncfusion UI Control oder ShellProgressBar verwenden, um gebrauchsfertige Fortschrittsbalken mit unglaublichen Designs zu erhalten.

Die einfachste Möglichkeit, einen Fortschrittsbalken mit Text zu erstellen, besteht darin, Beschriftungen zu verwenden und deren Text entsprechend dem Fortschritt einer Aufgabe zu ändern. Sie können seinen Fortschritt mit dem Fortschritt einer Aufgabe synchronisieren.

using System;
using System.Threading;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace ProgressBarExp {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void RunOperation_Click(object sender, EventArgs e) {
      BackgroundWorker taskSynch = new BackgroundWorker();
      taskSynch.WorkerReportsProgress = true;
      taskSynch.DoWork += taskSynch_DoWork;
      taskSynch.ProgressChanged += taskSynch_ProgressChanged;
      taskSynch.RunWorkerAsync();
    }

    private void Form1_Load(object sender, EventArgs e) {
      // make the percentage label `backcolor` transparent
      label1.BackColor = Color.Transparent;
    }

    void taskSynch_DoWork(object sender, DoWorkEventArgs e) {
      for (int i = 0; i < 101; i++) {
        (sender as BackgroundWorker).ReportProgress(i);
        Thread.Sleep(100);

        // to support multi-threading for label1 and label 2
        if (label1.InvokeRequired) {
          label1.Invoke(new MethodInvoker(delegate {
            // shows the progression, it is syched with the task progression
            label1.Text = "Progress: " + i + "%";
          }));
        }

        if (label2.InvokeRequired) {
          label2.Invoke(new MethodInvoker(delegate {
            if (i < 25) {
              label2.Text = "Starting the task...";
            } else if (i > 25 && i < 50) {
              label2.Text = "Half way through...";
            } else if (i > 50 && i < 99) {
              label2.Text = "The wait will be over soon...";
            } else if (i == 100) {
              label2.Text = "Task is completed successfully!";
            }
          }));
        }
      }
    }

    void taskSynch_ProgressChanged(object sender, ProgressChangedEventArgs e) {
      // it will update the progress bar in real time depends on the progress of a task
      progressBar1.Value = e.ProgressPercentage;
    }
  }
}

Ausgang:

C#-Fortschrittsbalken mit Text - Ausgabe

Sie müssen einen progressBar1-Fortschrittsbalken, eine Run Operation-Schaltfläche und label1- und label2-Labels in Form1 [Design] Ihres C#-Projekts erstellen, bevor Sie diesen C#-Code ausführen.

In diesem Tutorial haben Sie gelernt, wie Sie verschiedene Arten von Fortschrittsbalken erstellen und sie mit dem tatsächlichen Fortschritt einer Aufgabe mit der Klasse BackgroundWorker in C# synchronisieren.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

Verwandter Artikel - Csharp WinForms