Die Kommunikation zwischen zwei windows forms in C#
Habe ich zwei Formen, eine ist die Haupt-form und der andere ist ein options-form. So sagen zum Beispiel, dass der Benutzer klickt auf "my menu" auf der Haupt-form: Tools -> Options
würde dies dazu führen, dass mein Optionen form gezeigt werden.
Meine Frage ist, wie kann ich Daten aus meinen Optionen form zurück zu meinem main-form? Ich weiß, ich könnte Sie mit den Eigenschaften, aber ich habe eine Menge von Optionen, und dies scheint wie ein mühsam seltsame Sache zu tun.
Also, was ist der beste Weg?
Schließen Sie Ihre Einstellungen nach dem einstellen der Optionen und möchte das Hauptformular geöffnet mit der option Werte?
Im Grunde Ja.
Im Grunde Ja.
InformationsquelleAutor Bob Dylan | 2009-11-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Form1 löst Form2 zu öffnen. Form2 hat überladenen Konstruktor nimmt die aufrufende Formular als argument und liefert den Verweis auf Form2 Mitglieder. Dies löst das problem in der Kommunikation. Zum Beispiel habe ich ausgesetzt Label-Eigenschaft als public Form1, welche geändert wird in Form2.
Mit diesem Ansatz können Sie tun, Kommunikation in unterschiedlicher Weise.
Download-Link für das Sample-Projekt
//Form1
//Ihre Form2
(Quelle: ruchitsurati.net)
(Quelle: ruchitsurati.net)
Es ist das Zune-theme für XP. 🙂
Dies führt zu einer engen Kopplung der Formulare Form1 und Form2, ich denke, stattdessen sollte man die Verwendung von benutzerdefinierten Ereignissen für diese Art von Szenarien.
Woah Jahren der Programmierung in Winforms (als student tho), doch ich kam nie über diese Funktionalität und es ist sehr lustig zu implementieren...
InformationsquelleAutor this. __curious_geek
In den Kommentaren zu den akzeptierten Antworten, Neeraj Gulia schreibt:
Der Kommentar ist genau richtig. Die akzeptierte Antwort ist nicht schlecht; für einfache Programme, und vor allem für Menschen, die gerade lernen zu Programmieren und zu versuchen, um grundlegende Szenarien zu arbeiten, es ist ein sehr nützliches Beispiel dafür, wie ein paar Formen interagieren können.
Jedoch, es ist wahr, dass die Kupplung, die beispielsweise Ursachen kann und sollte vermieden werden, und dass in dem besonderen Beispiel, ein Ereignis würde das gleiche erreichen, in ein Allzweck -, entkoppelt Weg.
Hier ist ein Beispiel, mit dem akzeptierten Antwort - code als Basis:
Form1.cs:
Der obige code erstellt eine neue Instanz von
Form2
, und dann, bevor es zu zeigen, fügt ein Ereignis-handler für das FormularButton1Click
Veranstaltung.Beachten Sie, dass der Ausdruck
(sender, e) => Lbl.Text = ((Form2)sender).Message
konvertiert automatisch durch den compiler eine Methode, die sieht etwas ähnlich (aber definitiv nicht genau wie) dieses:Es gibt tatsächlich viele Wege, die/der Syntax zu implementieren und abonnieren Sie den event-handler. Zum Beispiel über eine anonyme Methode als die oben genannten, die Sie nicht wirklich brauchen, um die Besetzung der
sender
parameter; stattdessen können Sie einfach diefrm
lokale variable direkt:(sender, e) => Lbl.Text = frm.Message
.Gehen den anderen Weg, die Sie nicht brauchen, um eine anonyme Methode. Sie könnte in der Tat nur erklären, sondern einen regulären Methode, wie der compiler-generierte zeige ich oben, und abonnieren Sie diese Methode, um die Veranstaltung:
frm.Button1Click += frm_Message;
(wo Sie natürlich den Namenfrm_Message
für die Methode, so wie in meinem Beispiel oben).Unabhängig davon, wie Sie es tun, natürlich benötigen Sie für
Form2
tatsächlich umzusetzen, dassButton1Click
Veranstaltung. Das ist ganz einfach...Form2.cs:
Zusätzlich zu der Veranstaltung, habe ich auch erklärt, eine Eigenschaft
Message
durch dieText
Eigenschaft (und nur dieText
Eigenschaft, und nur als nur-lese-in der Tat), dertxtMessage
Kontrolle. Dies ermöglicht es dem Teilnehmer zu der Veranstaltung, um den Wert und tun, was es braucht, um mit ihm.Beachten Sie, dass alle, die die Veranstaltung benachrichtigt die Teilnehmer, dass die Taste hat tatsächlich geklickt wurde. Es ist bis zu den Abonnenten zu entscheiden, wie zu interpretieren oder reagieren Sie auf das Ereignis (z.B. durch abrufen des Werts der
Message
Eigentum und Zuordnung zu etwas).Alternativ könnte man in der Tat liefern den text zusammen mit dem Ereignis selbst, durch die Deklaration einer neuen
EventArgs
sub-Klasse und verwenden, die für die Veranstaltung statt:Dann kann der Abonnent nur die Nachricht abzurufen Wert direkt aus dem event-Objekt:
Das wichtigste Hinweis: in allen oben genannten Varianten ist, dass zu keinem Zeitpunkt hat die Klasse
Form2
müssen wissen, etwas überForm1
. MitForm1
wissen überForm2
unvermeidbar ist; nachdem alle, das ist das Objekt, das Sie erstellen Sie eine neueForm2
- Instanz und verwenden Sie es. Aber die Beziehung kann asymmetrisch sein, mitForm2
nutzbaren durch alle Objekt, das braucht die features, die es bietet. Durch bereitstellen der Funktionalität wie ein Ereignis (und Optional mit einer Eigenschaft), macht es sich nützlich, ohne die Begrenzung Ihrer Nützlichkeit nur dieForm1
Klasse.InformationsquelleAutor Peter Duniho
Das beste wäre in diesem Fall haben einige
OptionsService
Klasse/Schnittstelle, die zugänglich ist überIServiceProvider
.Fügen Sie einfach ein Ereignis, wenn sich etwas ändert, und den rest der app kann darauf reagieren.
InformationsquelleAutor leppie
Eigenschaften ist eine option, gemeinsame statische Klasse - eine weitere Möglichkeit, Ereignisse - eine andere option...
MVP, MVC, MVVM...
InformationsquelleAutor Dani
Könnten Sie versuchen,AutoMapper. Halten Sie Ihre Optionen in eine separate Klasse, und verwenden Sie dann AutoMapper-shuttle der Daten zwischen der Klasse und der form.
InformationsquelleAutor Andy S
Erstellen Sie eine Klasse und alle Ihre Eigenschaften innerhalb der Klasse .. eine Eigenschaft Erstellen, in der parent-Klasse, und legen Sie es von Ihrem Kind (Optionen) form
InformationsquelleAutor Zuhaib
Können Sie eine Funktion in der Form B in etwa so:
Und man kann es so nennen:
InformationsquelleAutor John Gietzen
MVC, MVP, MVVM-leichte overkill für jemanden, der zugegebenermaßen sagen, Sie wollen die tutorials. Das sind Theorien, die ganzen Kurse, die Ihnen gewidmet.
Wie schon geschrieben, vorbei an ein Objekt rund ist wahrscheinlich am einfachsten. Wenn die Behandlung von einer Klasse als Objekt (austauschbar in diesem Sinne) ist neu, dann möchten Sie vielleicht zu verbringen weitere 2-4 Wochen herauszufinden, Eigenschaften und Konstruktoren.
Ich bin kein C# - Meister mit allen Mitteln, aber diese Konzepte müssen ziemlich konkrete wenn Sie möchten, gehen viel weiter darüber hinaus übergeben von Werten zwischen zwei Formen (auch Klassen/- Objekte in Ihrem eigenen Recht). Nicht versuchen zu sein bedeutet hier überhaupt, es klingt wie Sie sind bewegt von so etwas wie VB6 (oder jede andere Sprache mit globals) auf etwas weit mehr strukturiert.
Irgendwann wird es klicken.
InformationsquelleAutor Sarkazein
Gibt es viele Möglichkeiten zum durchführen von Kommunikation zwischen zwei Formen.
Einige von Ihnen sind bereits erläutert worden. Ich zeige Ihnen die andere Weise herum.
Vorausgesetzt, Sie aktualisieren müssen einige Einstellungen aus der untergeordneten form an die übergeordnete Formular. Sie können Gebrauch machen von diesen zwei Arten :
Mit System.Aktion
Können Sie denken, es als eine callback-Funktion übergeben, um das Kind bilden.
OpenForms-Methode
Diese Methode ist einfach (2 Zeilen). Funktioniert aber nur mit Formen, die geöffnet sind.
Alles, was Sie tun müssen ist, fügen Sie diese beiden Zeilen, wo immer Sie wollen, um einige Daten.
InformationsquelleAutor Ozesh
Dies ist wahrscheinlich ausweicht dein problem ein wenig, aber meine Einstellungen-dialog verwendet die Einstellungen der Anwendung zu konstruieren. http://msdn.microsoft.com/en-us/library/k4s6c3a0.aspx
Ich kann nicht finden, ein gutes Beispiel, ähnlich wie ich es mache (das ist tatsächlich eine tatsächliche Klasse+Objekt), aber dies deckt einen anderen Weg, es zu tun:
Lesen default-Einstellungen der Anwendung in C#
InformationsquelleAutor Oren Mazor
Eine form ist eine Klasse wie jede andere Klasse. Fügen Sie einige öffentliche Variablen von der form-Klasse, und legen Sie Sie, wenn Sie klicken Sie auf die Schaltfläche zum schließen des Formulars (technisch sind Sie auch nur versteckt).
A VB.NET Beispiel, aber Sie erhalten die Idee -
In Ihrem OptionsForm Klasse:
etc. Setzen Sie, wenn Sie auf die Schaltfläche "Ok".
Also in deinem Haupt-Formular, wenn Sie auf die Schaltfläche "Optionen" - erstellen Sie Ihre Optionen form:
wenn er beendet wird, so ernten Sie die option Einstellungen aus der public-Variablen auf die form:
etc.
InformationsquelleAutor Ron Savage
Der beste Weg, um mit der Kommunikation zwischen den Behältern ist die Implementierung einer observer-Klasse
Dem observer-Muster ist ein software-design-pattern, in dem ein Objekt, genannt Subjekt, unterhält eine Liste der von ihm abhängigen, genannt Beobachter, und benachrichtigt Sie automatisch von jedem Zustand ändert, in der Regel durch den Aufruf einer Ihrer Methoden.
(Wikipedia)
ich die Weg dies zu tun ist, erstellen Sie eine Beobachter-Klasse, und innen etwas schreiben wie dieses:
also im Grunde: die erste Zeile sagt, dass es wäre eine Funktion, die jemand anderes implementieren wird
in der zweiten Zeile ist die Erstellung ein Ereignis, das Auftritt, wenn die Delegierte Funktion rufen
und die Dritte ist die Schaffung der Funktion, ruft das Ereignis
also in deinem UserControl, sollten Sie eine Funktion hinzufügen, wie dies:
und in Ihrer Form sollten Sie so etwas tun:
und jetzt, können Sie sich diese Funktion auf eine ganze Reihe anderer Steuerelemente und Container, und Sie werden alle das signal bekommen
Ich hoffe, dass dies helfen würde 🙂
InformationsquelleAutor Dor Lugasi