2010-12-29 13 views
6

Ich habe ein Formular (FORM-A), das erfordert, dass der Benutzer ein Fahrzeug auswählt. Der Benutzer sollte auf eine Schaltfläche auf FORM-A klicken, die sagen, dass Fahrzeug wählen. Ein Auswahlformular (FORM-B) sollte geöffnet werden, wo der Benutzer ein Fahrzeug auswählen kann. Der ausgewählte Wert sollte an FORM-A zurückgemeldet werden.MS Access: Wie kommunizieren Formulare Werte miteinander?

Wie würden Sie dies in MS Access 2010 erreichen?

FORM-B ist ein Endlosformular, das ein Bild des Fahrzeugs und einige andere Informationen enthält.

+0

Warum haben Sie, dass ein Popup-Formular, dies zu tun, ist der richtige Weg vorgegebenen hilft? Warum nicht eine Dropdown-Liste auf dem Hauptformular? –

+0

Ich gebe zu, dass ich das zuerst gemacht habe, aber danach wollte ich ein Bild des Fahrzeugs in den Auswahlprozess einbeziehen. Wenn es kein Steuerelement für die Auswahl von Listen gibt, das dies tun kann, stehe ich entweder mit einem Unterformular oder einem Popup fest. Das Popup gibt dem Benutzer das Gefühl, dass die Auswahl sicher ist, während das Unterformular (fortlaufende Form) den Benutzer daran zweifelt, ob die Auswahl wirklich stattgefunden hat. – cmaduro

Antwort

11

Von was ich von Ihrer Frage verstehe, möchten Sie FormB eine Art Pop-up öffnen. Wenn das Popup geschlossen wird, wird das Ergebnis irgendwo in die aufrufende Form gebracht.
Lösungsvorschlag:
a) Öffnen Sie FormB mit der Syntax docmd.openform "formB", windowmode:=acDialog.
Dies verhindert die Ausführung der nächsten Zeilen, bis formB geschlossen oder ausgeblendet ist.
b) in FormB in der OK-Taste, verstecken Sie einfach das Formular, schließen Sie es nicht.
c) wenn der Code in Forma wieder aufnimmt, können Sie jetzt

  1. überprüfen, ob formB noch offen ist. Wenn nicht, wird es abgebrochen
  2. den Wert in versteckten formB lesen (noch offen), dann schließen formB

Andernfalls könnten Sie haben auch formB eine Kontrolle in Forma zu aktualisieren, vor dem Schließen. Aber ich mag diesen Ansatz nicht, denn formB ist nicht wiederverwendbar und erzeugt eine unnötige Abhängigkeit zwischen formB und formA.

+1

Wenn Sie den separaten Dialog haben müssen - dann klingt das wie der Weg zu mir. –

+1

Machen Sie diese Art von Sache zu einer Funktion, die in der gesamten Anwendung aufgerufen werden kann. Sie können die Funktion einen komplexen Satz von Werten zurückgeben lassen, indem Sie einen Typ mit jedem der Felder, die Sie zurückgeben möchten, deklarieren. Belassen Sie einen, der "gültig" genannt wird, als booleschen Wert, der sagen kann, ob er funktioniert oder aus – akc42

+1

gestrichen wurde. Dies ist eine großartige Lösung für ein begrenztes System. Ich habe in der Vergangenheit (unter Verwendung von Me.OpenArgs) den Namen des aufrufenden Formulars und ein verstecktes Feld auf dem aufrufenden Formular übergeben, um den zurückgegebenen Wert zu speichern, aber das Formular offen zu lassen und den Status sichtbar zu ändern, führt dazu, dass der Aufrufcode des Formulars als fortgesetzt wird Wenn das Dialogfeld geschlossen wurde, ist dies viel einfacher! :) Danke +1 – GazB

0

Ich bin mir nicht sicher, warum Sie hierfür ein separates Formular benötigen - das erste Textfeld muss eine Auflistung aller Datensätze der Fahrzeuge in der Datenbank enthalten, aus denen Sie einen auswählen und den Rest der Fahrzeuginformationen wird automatisch aus der Fahrzeugtabelle ausgefüllt, aber nicht in Ihre Elterntabelle kopiert. Natürlich bin ich mir Ihrer Tischstruktur auch nicht sicher, also könnte es einen Grund für diese Methode geben, der mir nicht klar ist.

Die Vorteile des Verfahrens darüber, wenn Sie mehr Fahrzeuge hinzufügen, wird Ihre Auswahlbox automatisch aktualisiert - und Sie halten die Formulare, die Sie auf ein Minimum zu laden haben (immer eine gute Leistung move)

0

können Sie Erstellen Sie eine Instanz von FormB in FormA und steuern Sie sie. Unten ist der VBA-Code für formA. Wenn Sie auf eine Schaltfläche in FormularA klicken, erstellen Sie eine neue Instanz von formB und geben Sie den Fokus an. Gleichzeitig können Sie Eigenschaften für seine Steuerelemente festlegen. Sie können diesen Ansatz verwenden, um das richtige Bild in Ihrem Steuerelement auf Formular B zu setzen. Hoffe, das hilft.

Beispiel:

Option Compare Database 

Dim fB As Form_FormB 

Private Sub btnA_Click() 
    Set fB = New Form_FormB 
    fB.SetFocus 
    fB.tbxB.Text = "Some text sent from A to B!" 
End Sub 

Wenn Sie beiden Formen sichtbar sein sollen die ganze Zeit, schlage ich vor, ein Unterformular mit der Liste aller Fahrzeuge, die mit oder Details nur für die, die der Benutzer ausgewählt.

0

Sie können die Formulare auf diese Weise in Formularen! FormName! ControlName referenzieren. Sobald Sie sehen, wie das funktioniert, können Sie damit umgehen, damit es mit Ihrer bestehenden Einrichtung funktioniert. Verwenden wir 3 Steuerelemente ein Textfeld in Form A, ein Bild in Form B und ein Textfeld in Form B. Das Textfeld in Form A wird txtVehicle genannt, das Bild in Form B wird imgVehicle und das Textfeld in Form B wird TxtVehicleName benannt. Sie können den Namen eines Steuerelements in Eigenschaften festlegen. Wenn Sie auf imgVehicle klicken, wird der Wert von txtVehicleName in txtVehicle gesetzt.

Sie müssen ein wenig codieren - es ist einfach, wenn Sie es noch nicht getan haben. Unter Eigenschaften für das Bild sehen Sie Ereignisse. Wenn Sie auf das Ereignis "On Click" klicken, erhalten Sie eine Dropdown-Liste. Eine der Optionen ist [Ereignisprozedur] - wählen Sie das aus. Ein kleiner Knopf mit 3 Punkten erscheint auch am Ende der Reihe. Klicken Sie darauf und Sie sollten mit einem Code wie diesem in ein Codefenster geführt werden.

Private Sub imgVehicle_Click() 

End Sub 

Hier ist, wo Sie Ihren Code eingeben. So etwas sollte funktionieren. Dies ist es in seiner einfachsten Form.

Nun, obwohl das funktioniert, gibt es ein paar Dinge, die wir in dieser Methode tun sollten, die wir nicht tun. Wir sollten direkt auf Form-B verweisen, da wir uns darin befinden. Wir sollten überprüfen, dass Form-A tatsächlich offen ist.

Private Sub imgVehicle_Click() 
    If currentproject.allforms(“Form-A”).isloaded then 
      Forms!Form-A!txtVehicle=me!txtVehicleName 
    End if 
End Sub 

Hoffnung, die

+0

Dies funktioniert nicht, da nur fokussierte Elemente referenziert werden können. –

+0

Fokus ist nicht erforderlich, um auf ein Element oder ein Formular zu verweisen. Formulare müssen offen sein, müssen aber nicht einmal sichtbar sein. Unterformulare müssen explizit wie oben beschrieben referenziert werden. Es gibt bestimmte Eigenschaften, die nur mit Fokus verfügbar sind, wie die Texteigenschaft in einem Textfeld, aber sie sind in der Minderheit. – Praesagus

+0

Warum wird diese Antwort abgelehnt? – Praesagus