Hallo, ich komme wieder einmal nicht weiter und hätte gerne einen Ansatz für folgendes Problem:
Ich habe ein Programm, welches mehrere Forms geöffnet haben kann.
Ein Übersichtsform soll die wichtigsten Inhalte aller offenen Forms darstellen. Im einfachsten Fall z.B. eine Namensliste.
Mein Wunsch wäre, im Übersichtsform so eine Art Broadcast oder Event zu schicken, auf welches alle Forms hören und ihre Antwort zurück schicken.
Was wären denn hier die richtigen Stichworte zur Suche? Mit Broadcast finde ich immer wieder UDP Ansätze, ich dachte mehr an Events. Unter 'Callback' hatte ich bislang vermutet eine Lösung zu finden, aber zum Erfolg komme ich damit auch nicht.
u.U. wichtig zu wissen ist: dass das Übersichtsfor immer erst geöffnet wird, wenn die anderen Forms bereits laufen. Diese können sich also nicht am Ü.Form anmelden, die Suche/Anfrage muss also vom Ü.Form ausgelöst werden.
ich schätze mein Ansatz ist nicht der richtige?
Viele Grüße
Christian
Du könntest eine Klasse machen die alle Fensteraufrufe verwaltet und eine Liste mit Referenzen der Windows hält. Dann könntest du dich noch an das FormClosing-Event hängen um mitzubekommen wenn eins geschlossen wird.
Dazu benutzt man entweder Events oder eines der vielen MessageFrameworks wie z.b. TineMessanger.
Als Teil des Ökosystems gibts dazu .NET Reactive bzw. ReactiveUI
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Die gerade geöffneten Forms gibt es als Eigenschaft Application.OpenForms.
Falls du nur für bestimmte Forms die Liste anzeigen möchtest, könntest du ein Interface dafür definieren und per [FAQ] Casten aber richtig: Boxing/Unboxing - () / is / as / Pattern Matching abfragen.
Bei mir sieht das so aus wenn man das Programm schließt :
mel += "Folgende Fenster sind noch geöffnet :";
foreach (Form frm in Application.OpenForms)
mel += "\r\n" + frm.Text + " : " + frm.Name;
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
@BerndFfm
Ich würde dir an der Stelle den StringBuilder empfehlen um solche Meldungen per Schleife + Zeilenumbrüche umzusetzen.
Gerade auf anderen Platformen als Windows wirst du mit den hart codierten Zeilenumbruchzeichen Probleme kriegen.
Ebenfalls lässt sich hier auch mit String Interpolation arbeiten oder String.Format, was man über den Builder auch mit AppendFormat + AppendLine abbilden kann.
T-Virus
Inhalt als Offtopic markiert.
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Hallo,
danke für die regen Ideen.
Bevor wir zu weit vom eigentlichen Ziel abweichen muss ich nochmal klarer sagen was gemeint ist. Letztendlich ist nicht das Ziel tatsächlich irgendwie die offenen Forms genannt zu bekommen, sorry für die unklare Formulierung.
Es ist so:
Das Windows Forms Programm hat eine Menge zuschaltbarer Funktionsmodule. Diese werden, je nach Konfiguration des Programmes, freigeschaltet, z.B.:
Es soll ein übergeordnetes Status-Form im Hauptprogramm durch Tastendruck geöffnet werden. Dieses soll nun eine 'broadcast ähnliche' Aufforderung schicken, welche alle aktiven Funktionsmodule dazu veranlasst, sich beim Status-Form zu melden, damit dieses dann deren Namen auflisten kann. Sobald sich ein Modul am Status-Form angemeldet hat soll das Status-Form auf ein Event des jeweiligen Modules hören, in welchem Messdaten übertragen werden. Die Anmeldung am Status-Form kann aber nicht bei Programmstart erfolgen, da dieses zu dem Zeitpunkt nicht läuft. Das Status-Form muss also zur Anmeldung aufrufen.
Jo, und dafür gibts Messaging.
Links siehe oben.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code