Um einen Fortschrittsdialog anzuzeigen, rufen Sie "ShowDialog" mit dem Designnamen "Progress" (Konstante DesignNameProgressBar) auf, nachdem Sie "RunWorkerAsync()" aufgerufen haben:
ShowDialog(this, DesignNameProgressBar);
Es erscheint folgender Dialog:
Fortschritt initialisieren und ändern
Die Initialisierung des Fortschrittsbalkens und des aktuellen Fortschrittes machen Sie in ihrer Methode, die im Hintergrund ausgeführt werden soll. In dem obigen Beispiel wäre es die Methode MyAsyncTask:
void MyAsyncTask()
{
CurrentProgressInfo.TotalProgress.ProgressText = "My progress text";
CurrentProgressInfo.TotalProgress.ProgressRangeFrom = 0;
CurrentProgressInfo.TotalProgress.ProgressRangeTo = 1000;
CurrentProgressInfo.TotalProgress.ProgressCurrent = 0;
for (int i = 0; i < 1000; i++)
{
CurrentProgressInfo.TotalProgress.ProgressCurrent++;
// Do some work
}
}
CurrentProgressInfo ist eine Eigenschaft von ACBSO und vom Typ "gip.core.datamodel.ProgressInfo":
public class ProgressInfo : INotifyPropertyChanged, IVBProgress
{
public TaskProgressInfo TotalProgress { get; }
public List<TaskProgressInfo> SubTaskList { get; }
}
ProgressInfo wiederum besteht aus "gip.core.datamodel.TaskProgressInfo"-Instanzen. Wobei die Eigenschaft "TotalProgess" den Gesamtfortschritt anzeigt und die Liste "SubTaskList" viele weitere Unterfortschritte anzeigen kann.
public class TaskProgressInfo : INotifyPropertyChanged
{
public int ProgressRangeFrom { get; set; }
public int ProgressRangeTo { get; set; }
public int ProgressCurrent { get; set; }
public string ProgressText { get; set; }
}
Vor Beginn der Aufgaben-Ausführung definieren Sie per ProgressRangeFrom und ProgressRangeTo-Eigenschaft den Bereich des Fortschrittsbalkens. Während der Ausführung inkrementieren Sie die ProgressCurrent-Eigenschaft, damit sich der Fortschrittsbalken im Dialog aktualisiert.
Unterfortschritte
Um weitere Fortschrittsbalken für Unteraufgaben anzuzeigen, verwenden Sie die Methode "AddSubTask":
int rangeFrom = 0, rangeTo = 100;
ProgressInfo.AddSubTask("MySubTaskname", rangeFrom, rangeTo);
Um den aktuellen Fortschritt einer Unteraufgabe zu aktualisieren, verwenden Sie die Methode "ReportProgress":
void ReportProgress(string subTaskName, int? progressCurrent, string newProgressText = null)
Im ersten Parameter übergeben Sie den Tasknamen. Übergeben Sie null, wenn Sie den Hauptfortschrittsbalken aktualisieren möchten.
Im zweiten Parameter übergeben Sie den aktuellen Fortschritt. Bei null wird nichts verändert.
Im dritten Parameter übergeben Sie den Fortschritts-Text. Bei null wird nichts verändert.
// Sets the current progress of a subtask (ProgressCurrent of a instance in SubTaskList):
ProgressInfo.ReportProgress("MySubTaskname", mySubTaskCounter);
// Changes the progresstext of a subtask (ProgressText of a instance in SubTaskList):
ProgressInfo.ReportProgress("MySubTaskname", null, "Completed");
// Changes the total progress (TotalProgress.ProgressCurrent):
ProgressInfo.ReportProgress(null, myMainCounter);
// Changes the progresstext of the main header (TotalProgress.ProgressText):
ProgressInfo.ReportProgress(null, null, "Completed");
ReportProgess löst das Ereignis ProgressCurrent aus das mit der virtuellen Methode
public virtual void BgWorkerProgressChanged(object sender, ProgressChangedEventArgs e)
aus ACBSO verbunden ist. Sie können diese Methode überschreiben, falls Sie daran interessiert sind.
Individuelles Design
Falls Ihnen das "Progress"-Design aus ACBSO nicht gefällt, können Sie den Dialog mit einem eigenen Design anzeigen. Entweder Sie machen sich eine Basisklasse für alle Ihrer BSO's bei der Sie das "Progress"-Design überschreiben oder Sie vergeben einen neuen Namen. Das Standarddesign verwendet das iPlus-Steuerelement "gip.core.layoutengine.VBProgressBar" zu Anzeige:
Binden Sie die ProgressRangeFrom-Eigenschaft an die "RangeBase.Minimum"-Eigenschaft, ProgressRangeTo and "RangeBase.Maximum" und ProgressCurrent an "RangeBase.Value".