Im Beitrag “Neue Datensätze oben anfügen” haben wir uns angesehen, wie Sie ein Unterformular in der Datenblattansicht, das nur einen leeren, neuen Datensatz anzeigt, über einem normalen Datenblatt mit den Daten der gleichen Tabelle platzieren. Damit erhält der Benutzer die Möglichkeit, einen Datensatz oben einzufügen und nicht, wie sonst üblich, unten. Das Problem hierbei ist, dass der Benutzer immer noch die Spalten des oberen Formulars anders anordnen oder ihre Breite ändern kann. Das wirkt sich nicht automatisch auf die Spalten des darunter positionierten Formulars aus. Also müssen wir noch ein wenig Arbeit investieren, um dieses Verhalten zu dieser Lösung hinzuzufügen.
Wir rufen uns zuerst noch einmal die Konstellation der Lösung aus dem Beitrag Neue Datensätze oben anfügen (www.access-im-unternehmen/1160) ins Gedächtnis. Hier haben wir ganz oben im Formular frmArtikel ein Unterformular mit geringer Höhe platziert, welches nur die Spaltenköpfe sowie eine einzige Zeile anzeigen soll, die den neuen, leeren Datensatz anzeigt, der sonst unten im Datenblatt angezeigt wird (siehe Bild 1).
Bild 1: Entwurf der beiden übereinander angeordneten Unterformulare in der Datenblattansicht
Wenn wir in die Formularansicht wechseln, sehen wir, dass das obere Unterformular genau so platziert ist, dass die Spaltenüberschriften des unteren Unterformulars nicht zu sehen sind. Dadurch erscheint die Ansicht so, als ob es sich tatsächlich nur um ein Formular in der Datenblattansicht handelt, bei dem die Zeile zum Einfügen eines neuen Datensatzes ganz oben angezeigt wird (siehe Bild 2).
Bild 2: Formularansicht der beiden Unterformulare in der Datenblattansicht
Wenn wir nun allerdings die Breiten der Spaltenüberschriften ändern oder deren Anordnung ändern, wirkt sich dies nur auf die Spaltenköpfe selbst und die Zeile mit dem neuen Datensatz im oberen Unterformular aus (siehe Bild 3). Das Verhalten ist ganz normal, denn das untere Unterformular weiß ja nichts vom oberen Unterformular.
Bild 3: Das Anpassen der Spaltenköpfe wirkt sich nicht auf das untere Formular aus.
Spalten synchron halten
Wenn wir wollen, dass die Spalten des unteren Unterformulars synchron mit den Spalten des oberen Unterformulars geändert werden, müssen wir die Ereignisse identifizieren, die beim ändern der Spaltenbreiten und beim ändern der Reihenfolge der Spalten ausgelöst werden. Wie finden wir diese heraus
Falls uns kein Ereignis aufgrund seines Namens auffällt, legen wir für die möglichen Ereignisse jeweils eine Ereignisprozedur an und fügen darin entweder eine Debug.Print-Anweisung ein, die den Namen der Ereignisprozedur ausgibt, oder fügen Haltepunkte zu den jeweiligen Prozedurköpfen hinzu.
Hier kommen die folgenden Ereigniseigenschaften in Frage:
- Beim Klicken
- Bei Maustaste ab
- Bei Maustaste auf
- Bei Mausbewegung
Also hinterlegen wir testweise die folgenden Ereignisprozeduren für die Ereigniseigenschaften:
Private Sub Form_Click() Debug.Print "Beim Klicken" End Sub Private Sub Form_MouseDown(Button As Integer, _ Shift As Integer, X As Single, Y As Single) Debug.Print "Bei Maustaste ab" End Sub Private Sub Form_MouseMove(Button As Integer, _ Shift As Integer, X As Single, Y As Single) If Not Button = 0 Then Debug.Print "Bei Mausbewegung" End If End Sub Private Sub Form_MouseUp(Button As Integer, _ Shift As Integer, X As Single, Y As Single) Debug.Print "Bei Maustaste auf" End Sub
Hier erkennen wir dann, dass diese Ereignisse immer ausgelöst werden, wenn der Benutzer auf einen der Bereiche mit Ausnahme der Felder zur Eingabe der Daten eine Aktion mit der Maus ausführt – also in den Spaltenköpfen, im Datensatzmarkierer und in dem grauen Bereich links von den Spaltenköpfen und oberhalb des Datensatzmarkierers.