Benutzer mit den meisten Antworten
Aus einer Klassenbibliothek Werte an WindowsForm Klasse übergeben

Frage
-
Hallo,
ich weiß, dass diese Frage schon viel zu oft gestellt wurde doch leider komme ich nicht weiter.
Ich habe eine Klassenbibliothek mit einer Klasse "Extractor" und mehreren Methoden. Im Konstruktor der Klasse werden diese Methoden aufgerufen.
Jetzt habe ich eine Windows Form erstellt damit ein Benutzerbeliebiger string übergeben werden kann. Außerdem ein Start Button wo dann der Konstruktor der Klasse "Extractor" aufgerufen wird. Wenn ich das Programm ausführe funktioniert auch alles, nur während das Programm arbeitet ist die Windows Form gesperrt. (D.h ich kann Sie nicht bewegen oder am Text was ändern bis das Programm alle Methoden durchgelaufen ist)
Jetzt hätte ich aber gerne, dass ich den Status des Programms an die Windows Form übergeben kann. Wenn ich z.B. versuche an einer bestimmten Stelle des Programms einen Label Text der Form (mit erstellen einer Instanz der Form) zu ändern dann wird die Änderung erst dann wahrgenommen wenn das Programm vollständig durchlaufen ist.
Aber ich hätte gerne eine ProgressBar die den aktuellen Status anzeigt, doch da die Laufzeit unterschiedlich ist muss ich ja von der Klasse "Extractor" an der richtigen stelle die Information so übergeben dass die Windows Form die direkt verarbeiten kann.
Leider kenn ich mich mit Ereignissen und Delegates nicht aus, habe aber das Gefühl dass es nicht die Lösung zu meinem Problem ist. Wenn ich mich irre dann lese ich mich da nochmal genauer ein.
Könnte mir jemand bei dem Ansatz helfen? Wie gehe ich da am besten vor? Bin leider noch eher ein C# Anfänger:)
MfG
Antworten
-
Hallo,
das aktualisieren des Fortschritts machst du am besten mit einem Event in der Extractor Klasse. Dieses kannst du regelmäßig auslösen und so den Fortschritt mitteilen. In deiner Form wiederum abbonnierst du das Event und änderst passend Value und MaxValue des ProgressBars. Beispiele findest du im Internet, so in etwas musst du das auch umsetzen.
Zu der Fehlermeldung:
Auf UI-Elemente darf immer nur der UI-Thread zugreifen. Alle anderen müssen sich erst mit ihm "einigen" mit Hilfe der Invoke-Methode.form.Invoke(new Action(() => form.label3.Text = "Aktueller Status"));
Wobei du von außen besser nicht die Label-Eigenschaften veränderst, sondern das besser in eine Methode weg kapselst, die intern die Änderungen vornimmt und von außen lediglich das notwendige entgegen nimmt. Das hat den Vorteil, dass bei einer Änderung alles was die Form betrifft auch in der Form drin ist.
BTW, mit einem BackgroundWorker funktioniert das ganze zwar, ab C# 5 würde ich jedoch zu Async/Await greifen. Das wird auch von neueren APIs so geamacht.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub- Als Antwort markiert ChrissixD Dienstag, 11. April 2017 14:29
Alle Antworten
-
Hi!
Du könntest einen BackgroundWorker nehmen:
Gruß
Freiberufler im Bereich Softwareentwicklung Von der PLC und Robotik zu VB.NET & C#, vorrangig WPF und UWP
-
Hallo Stefan,
ja genau das habe ich gesucht, habe es jetzt so umgesetzt und jetzt ist die Form bedienbar auch nach dem Start.
Doch wie kann ich jetzt aus der Klasse "Extractor" auf die Windows Form UI Elemente zugreifen?
WindowsFormTestZIP.Form1 form = Application.OpenForms[0] as WindowsFormTestZIP.Form1; form.label3.Text = "Aktueller Status..";
Wenn ich das so versuche kommt die Fehlermeldung:
Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement label3 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
Wie mach ich das jetzt?
-
Hi,
es macht keinen Sinn, aus der Klasse in der externen Bibliothek auf die Form zuzugreifen.
Stell über Ereignisse oder Methoden in der Klasse die Daten bereit, die in der Form verwendet werden soll und greif diese dann über die Form selbst ab.
Der Weg, den Du gehen willst, führt bspw. dazu, dass die Controls immer exakt diese Namen haben müssten, sie dürften auch nicht verschachtelt in anderen Controls sein, da dann der Zugriff auch nicht über den hinterlegten Code funktioniert, usw.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Dienstag, 11. April 2017 11:49
-
Hallo,
das aktualisieren des Fortschritts machst du am besten mit einem Event in der Extractor Klasse. Dieses kannst du regelmäßig auslösen und so den Fortschritt mitteilen. In deiner Form wiederum abbonnierst du das Event und änderst passend Value und MaxValue des ProgressBars. Beispiele findest du im Internet, so in etwas musst du das auch umsetzen.
Zu der Fehlermeldung:
Auf UI-Elemente darf immer nur der UI-Thread zugreifen. Alle anderen müssen sich erst mit ihm "einigen" mit Hilfe der Invoke-Methode.form.Invoke(new Action(() => form.label3.Text = "Aktueller Status"));
Wobei du von außen besser nicht die Label-Eigenschaften veränderst, sondern das besser in eine Methode weg kapselst, die intern die Änderungen vornimmt und von außen lediglich das notwendige entgegen nimmt. Das hat den Vorteil, dass bei einer Änderung alles was die Form betrifft auch in der Form drin ist.
BTW, mit einem BackgroundWorker funktioniert das ganze zwar, ab C# 5 würde ich jedoch zu Async/Await greifen. Das wird auch von neueren APIs so geamacht.
Viele Grüße, Tom Lambert - MVP, MCC und MSP
Wozu Antworten markieren und Posts bewerten? Klicke hier
Nützliche Links: .NET Quellcode | C#/VB.NET Konverter | GitHub Forum Samples | Account bestätigen (Verify Your Account)
Ich: Webseite | Facebook | Twitter | Code Snippets | GitHub- Als Antwort markiert ChrissixD Dienstag, 11. April 2017 14:29
-
Danke Tom, für den Gedankenanstoß, ich werde mich demnächst mal in Ruhe damit beschäftigen, weil so auf anhieb funktioniert es bei mir leider nicht so einfach, bin aber auch wie gesagt gerade erst mit der Programmierung angefangen.
- Bearbeitet ChrissixD Dienstag, 11. April 2017 14:32