2009-05-26 24 views
1

Ich habe ein Hauptformular MYMAIN mit zwei Unterformularen in es MYSUBONE und MYSUBTWO.wie zu überprüfen, ob Teilformular in MS Zugriff geöffnet ist

Ich habe "aktuelle" Ereignisse in jedem Teilformular, die Textfeld in dem anderen Unterformular aktualisieren.

Mein Problem tritt auf, wenn die Formulare geladen werden. Das Ereignis "on current" wird ausgelöst, wenn das Unterformular "MYSUBONE" geladen wird (BEVOR "MYSUBTWO" geladen wird) und versucht, ein Textfeld in MYSUBTWO zu aktualisieren, das noch nicht geladen ist. Daher wird in der Ereignisprozedur ein Fehler ausgelöst.

Wie überprüfe ich meine "on current" Ereignisprozedur (in VBA?) Für MYSUBONE, um zu überprüfen, ob das Unterformular MYSUBTWO noch nicht geladen ist.

auf strom mysubone wenn mysubtwo nicht dann Update mysubtwo.textbox geladen wird = ... end if

habe ich versucht, die "IsLoaded" -Funktion in der Beispieldatenbank "Nordwind", aber nicht scheinen zu arbeiten. Wie überprüfe ich, ob das Teilformular noch nicht geladen ist?

Oder könnte ich einfach Fehler ignorieren und etwas wie "wenn Fehler, Funktion beenden" verwenden?

+0

IsLoaded() funktioniert nicht mit Teilformularen, da sie nicht Teil der Forms-Sammlungen sind - nur die Hauptformulare sind in dieser Sammlung. –

Antwort

0

Unterformulare werden tatsächlich geöffnet, bevor das Hauptformular geöffnet wird (einschließlich aller OnCurrent-Ereignisse). Ich glaube nicht, dass Sie garantieren können, in welcher Reihenfolge sie geladen sind.

Ich würde das Problem umdrehen und das Update vom Hauptformular durchführen. Wenn Sie das Update wirklich vom Subformular aus durchführen müssen, verschieben Sie das Update in eine separate Funktion in MySubOne. Rufen Sie dann in OnCurrent des Hauptformulars die Funktion in MySubOne auf. Dies garantiert, dass sowohl MySubOne als auch MySubTwo bereits geladen sind.

+0

Dies verhindert, dass die Teilformulare das entgegengesetzte Teilformular aktualisieren, wenn sich ihre Daten anstelle des Hauptformulars ändern. – JeffO

+0

Das ist leicht zu lösen, indem Sie einen Aufruf derselben Funktion für das AfterUpdate-Ereignis für das Unterformular einleiten. – BIBD

+0

Beachten Sie auch, dass das OnCurrent-Ereignis eines Unterformulars zweimal aufgerufen wird, wenn das übergeordnete Formular in einem neuen Datensatz eintrifft. Manchmal müssen Sie Code eingeben, um Dinge im OnCurrent eines Unterformulars davon abzuhalten, zweimal zu zünden. Die übliche Methode hierfür ist, eine Variable auf Modul-Ebene im Code des Unterformulars zu haben, um den PK-Wert des letzten OnCurrent-Ereignisses zu speichern. Überprüfen Sie im OnCurrent, ob der Wert dieser Variablen dem aktuellen PK-Wert entspricht. Wenn ja, dann überspringen Sie den Code (Sie sind bereits auf der zweiten OnCurrent). Wenn nicht, lassen Sie das Ereignis auslösen und ändern Sie den Wert der Variablen. Unordentlich? Ja! –

4

Eine Möglichkeit, dieses Problem zu lösen, besteht darin, sicherzustellen, dass Sie genau wissen, in welcher Reihenfolge die Teilformulare geladen sind. Dazu können Sie die Teilformularsteuerelemente lösen und manuell laden. Hier ist, wie es geht:

  1. Fügen Sie Ihre Unterformularsteuerelemente wie gewohnt zum übergeordneten Formular hinzu.
  2. Stellen Sie sicher, dass Sie Ihre Verknüpfungsfelder usw. so eingerichtet haben, wie Sie möchten.
  3. Löschen Sie auf der Registerkarte Eigenschaften des Unterformulars> data den Wert im Feld "Quellobjekt".

VBA hinzufügen, um manuell die Steuerelemente zu binden, wenn das übergeordnete Formular öffnet:

Private Sub Form_Open(Cancel As Integer) 
    Me.sfB.SourceObject = "FormB" 
    Me.sfA.SourceObject = "FormA" 
End Sub 
-1

"ist es eine Möglichkeit, wenn die abgerufene subforms Rekordzählimpuls 0 ist zu prüfen,"

if forms!myMainForm!mySubForm.form.RecordsetClone.RecordCount = 0 then.... 
0

Ich weiß nicht, ob es noch nützlich ist, aber für was es wert ist ... Ich zeige zwei Raster mit Eltern-Kind-Beziehung. Das zweite Raster zeigt jedoch gleichzeitig alle untergeordneten Datensätze an, die allen übergeordneten Datensätzen im ersten Raster zugeordnet sind. Wenn ein Datensatz im ersten Raster ausgewählt ist, möchte ich den ersten entsprechenden untergeordneten Datensatz im zweiten Raster suchen. Ich hatte die gleichen Probleme, da der Verweis auf das Re-Cord-Set des zweiten Rasters beim ersten Öffnen des Hauptformulars fehlschlägt, da das zweite Raster noch nicht angezeigt wurde. Meine Problemumgehung bestand darin, den Fehler 2455 zu erfassen und zu ignorieren, sodass die Möglichkeit besteht, fortzufahren, bis das zweite Raster vollständig angezeigt wird.

Verwandte Themen