2016-09-02 2 views
1

Die Hauptform meines Programms hat eine Schaltfläche, die eine zweite Form namens PortOpener öffnet. PortOpener ist so eingerichtet, dass er serielle, GPIB-, Ethernet- und USB-Ports öffnet, um mit externen Geräten zu kommunizieren. Sie wählen alle Daten aus, die zum Öffnen des Ports im PortOpener erforderlich sind, und klicken auf die Schaltfläche zum Öffnen des Ports. Dies übergab alle Portinformationen an eine neue Form namens serialWindow und dann serialWindow öffnet den Port.Zugriff auf eine Instanz eines Objekts aus einem anderen Formular

Hier wird das serialWindow erstellt und wie die Daten an das neue Formular übergeben werden.

private void OpenPortButton_Click(object sender, EventArgs e) 
    { 
     SerialWindow _serialWindow = new SerialWindow(); 
     _serialWindow.Show(); 
     _serialWindow.OpenCom(cboPort.SelectedItem.ToString(), cboParity.SelectedItem.ToString(), cboStop.SelectedItem.ToString(), cboData.SelectedItem.ToString(), cboBaud.SelectedItem.ToString(), NamePortTextBox.Text); 
    } 

Hier ist das neue serialWindow, das an den Port angeschlossen wird.

Der Port wird geöffnet und ich kann Daten über den Port senden und empfangen. Ich kann mehrere Instanzen des Formulars öffnen, indem Sie verschiedene COM-Anschlüsse auswählen. Ich versuche es so zu machen, dass die mainForm Daten an das serialWindow übertragen kann.

Ich weiß, wie Sie Daten aus dem SerialWindow mit dieser Methode an die MainForm übergeben.
How to access a form control for another form?

Ich bin nicht sicher, wie man zwischen den verschiedenen Instanzen von serialWindows unterscheidet. Wenn die mainForm Daten über COM 3 und 6 übertragen möchte, werden COM-Ports geöffnet, wie würdest du sie adressieren? Sollte ich versuchen, es an alle von ihnen zu senden und dann die serialWindows prüfen lassen, ob der geöffnete COM-Port dem entspricht, auf dem ich übertragen möchte?

portOpenerForm

serialWindowForm

Danke für die Hilfe zu wissen,

+0

Auch wenn das Denken nur in Formularen nicht der beste Weg wäre, würde ich ein Dictionary in der MainForms-Klasse erstellen, die alle geöffneten Ports und die entsprechenden serialWindow-Instanzen verfolgt. Mit Schlüsseln wie COM3 oder USB1 können Sie zwischen den Verbindungen unterscheiden. Fügen Sie die Referenz hinzu, wenn Sie verbunden sind, und entfernen Sie sie beim Trennen. – Yosh

+0

Es gibt zahlreiche Ansätze, die Sie ergreifen können. Siehe das markierte Duplikat für verschiedene Optionen.Wenn Sie dies immer noch nicht beheben können, senden Sie eine neue Frage, in der Sie eine gute [mcve] eingefügt haben, die deutlich zeigt, was Sie versucht haben, zusammen mit einer genauen und detaillierten Erklärung, was der Code jetzt macht und was Sie wollen es stattdessen zu tun, und was _ specific_ Problem Sie haben dieses Ziel zu erreichen. –

+1

Peter Duniho, nicht sicher, ob du trollst oder nicht. Wenn Sie die ganze Frage lesen, würden Sie sehen, dass ich weiß, wie man Daten zwischen 2 Formularen weiterleitet und einen Beispiellink liefert, von dem Sie behaupten, dass meine Frage eine Duplizierung ist. Was ich wollte, war, mit der richtigen Form zu sprechen, wenn mehrere Versionen dieses Formulars geöffnet wurden. Steve half, die Antwort mit Application.OpenForm.OfType zu lösen. – Laggmaster

Antwort

0

Diese relativ einfach ist, dass alle offenen Formen in der Application.OpenForms Sammlung gespeichert werden.

zu Ihrem SerialWindow hinzufügen öffentliches Eigentum bilden genannt (zum Beispiel) Portname des Typs string

In SerialWindow Code

public string PortName { get; set; } 

jetzt innerhalb der Methode OpenCom diese Eigenschaft

public void OpenCom(string port, string parity, string stop, string data, string baud, string PortName) 
{ 
    this.PortName = port; 
    comm.PortName = port; 
    .... 
    comm.OpenPort(); 
} 

An dieser Stelle kann Ihre MainForm das spezifische SerialWindow identifizieren, wenn Sie diese öffentliche Eigenschaft betrachten:

In Mainform Sie Schleife über die Application.OpenForms Sammlung, wo alle Formularinstanzen von der Anwendung geöffnet gehalten werden und nur die Formen der Art finden SerialWindow

foreach(SerialWindow frm in Application.OpenForms.OfType<SerialWindow>()) 
{ 
    // If this is a SerialWindow, then it has the property PortName 
    if(frm.PortName == "COM4") 
     ... pass your data to the frm instance 
} 

Dies ist natürlich für jede Eigenschaft angepasst werden könnte, dass Sie wollen Sie von Ihnen überprüfen mainForm

+1

Application.OpenForms.OfType hat den Job erledigt. Danke, dass Sie gezeigt haben, wie Sie mehrere Formen desselben Objekts unterscheiden können. – Laggmaster

+0

Es ist ein Akt der Höflichkeit zu erklären, ein Downvote und ein nützlicher Rat an zukünftige Leser, um die schlechte Antwort zu vermeiden – Steve

+0

Was down vote? Ich habe deine Antwort als Antwort akzeptiert und dich für die Veröffentlichung ausgewählt. Ich habe nicht den Ruf, der für die Abstimmung erforderlich ist. – Laggmaster

Verwandte Themen