Access zu WPF: Validierung und Navigation

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Im Artikel “Access zu WPF: Detailformulare mit Combo, Checkbox und Button” haben wir gezeigt, wie Sie die in Formularen enthaltenen gebundenen Steuer-elemente wie Kombinationsfelder und Kontrollkästchen sowie Schaltflächen in WPF-Fenster übertragen. In diesem Artikel wollen wir uns ansehen, wie Sie einem WPF-Fenster auf Basis eines Access-Detailformulars eine Validierung und Navigationsschaltflächen hinzufügen. Die notwendigen Techniken haben wir bereits im Artikel “EDM: Blättern in Datensätzen” vorgestellt, nun integrieren wir diese in unsere VBA-Prozedur zum Erstellen des Codes für ein WPF-Fenster mit Navigationsschaltflächen.

Um festzulegen, ob ein Formular mit oder ohne Validierung und Navigationsschaltflächen erstellt werden soll, fügen wir der Prozedur FormularNachWPF zwei weitere Parameter hinzu:

  • bolValidation: Gibt an, ob die Validierung hinzugefügt werden soll.
  • bolNavigation: Gibt an, ob die Navigationsschaltflächen hinzugefügt werden sollen.

Die Validierung für einen neuen, leeren Datensatz sieht dann etwa wie in Bild 1 aus.

Validierung bei einem neuen, leeren Datensatz

Bild 1: Validierung bei einem neuen, leeren Datensatz

Die Prozedur FormularNachWPF erweitern wir an den folgenden Stellen um die Entgegennahme beziehungsweise Übergabe der Parameter:

Public Sub FormularNachWPF(strForm As String, strTabelle As String, Optional bolValidation As Boolean, _
         Optional bolNavigation As Boolean)
     ... 
     lngHeight = TwipsToPixelsHeight(frm.Section(0).Height) + 30
     If bolNavigation = True Then
         lngTopNavi = lngHeight - 30
         lngHeight = lngHeight + 28
     End If

Bei der Definition des Window-Elements fügen wir noch das Ereignisattribut Closing mit dem Wert Window_Closing hinzu, welches sicherstellt, dass das Fenster nur bei geändertem und gespeichertem Datensatz geschlossen werden kann:

     strXAML = strXAML & "<Window x:Class=""" & frm.Name & """" & vbCrLf
     ...
     strXAML = strXAML & "        Title=""" & strTitle & """ Height=""" & lngHeight & """ Width=""" & lngWidth _
         & """ Closing=""Window_Closing"">" & vbCrLf

Für die folgenden Aufruf haben wir die Übergabe der Parameter bolValidation und bolNavigation erweitert:

     ...
     AttributeHinzufuegen frm, strXAML, bolValidation, bolNavigation
     ...
     SteuerelementeHinzufuegen frm, strXAML, strTabelle, colMappings, bolValidation, bolNavigation
     If bolNavigation Then
         NavigationHinzufuegen strXAML, lngTopNavi
     End If
     ...
End Sub

Erweiterung der Prozedur AttributeHinzufuegen

Die XAML-Datei enthält mit eingebauter Validierung einige Zeilen Code mehr. Diesem werden wir in der Prozedur AttributeHinzufuegen wie folgt gerecht, die ebenfalls die beiden Parameter bolValidation und bolNavigation erwartet:

Public Sub AttributeHinzufuegen(frm As Form, strXAML As String, bolValidation As Boolean, bolNavigation As Boolean)

In dieser Prozedur geht es allein um das Zusammenstellen allgemeiner Properties für Steuerelemente im WindowResources-Bereich. Da wir hier auch die Steuer-elemente durchlaufen, um die DataTrigger und MultiDataTrigger für die Validierung zu definieren, benötigen wir eine Variable namens ctl mit dem Typ Control:

     Dim ctl As Control

Danach geht es dann direkt rund. Wir prüfen, ob bolValidation den Wert True aufweist und fügen dann die Vorlage für die Markierung nicht erfolgreich validierter Steuer-elemente hinzu:

     strXAML = strXAML & "        <Window.Resources>" & vbCrLf
     If bolValidation Then
         strXAML = strXAML & "        <Style TargetType=""{x:Type FrameworkElement}"">" & vbCrLf
         strXAML = strXAML & "            <Setter Property=""Validation.ErrorTemplate"">" & vbCrLf
         strXAML = strXAML & "                <Setter.Value>" & vbCrLf
         strXAML = strXAML & "                    <ControlTemplate>" & vbCrLf
         strXAML = strXAML & "                        <DockPanel>" & vbCrLf
         strXAML = strXAML & "                            <Border Background=""Red"" DockPanel.Dock=""right"" " _
             & "Margin=""5,0,0,0"" Width=""20"" Height=""20"" CornerRadius=""10""" & vbCrLf
         strXAML = strXAML & "                                ToolTip=""{Binding ElementName=customAdorner, " _
             & "Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"">" & vbCrLf
         strXAML = strXAML & "                                <TextBlock Text=""!"" VerticalAlignment=""center"" " _
             & "HorizontalAlignment=""center""" & vbCrLf
         strXAML = strXAML & "                                   FontWeight=""Bold"" Foreground=""white"" />" & vbCrLf
         strXAML = strXAML & "                            </Border>" & vbCrLf
         strXAML = strXAML & "                            <AdornedElementPlaceholder Name=""customAdorner"" " _
             & "VerticalAlignment=""Center"" >" & vbCrLf
         strXAML = strXAML & "                                <Border BorderBrush=""red"" BorderThickness=""1"" />" & vbCrLf
         strXAML = strXAML & "                            </AdornedElementPlaceholder>" & vbCrLf
         strXAML = strXAML & "                        </DockPanel>" & vbCrLf
         strXAML = strXAML & "                    </ControlTemplate>" & vbCrLf
         strXAML = strXAML & "                </Setter.Value>" & vbCrLf
         strXAML = strXAML & "            </Setter>" & vbCrLf
         strXAML = strXAML & "        </Style>" & vbCrLf
     End If
     ...

Der nächste Teil, der nur von der Notwendigkeit einer Validierung abhängt, sind die Elemente ComboBox und TextBox, die wir beide mit den Style-Attributen für die Validierung ausstatten müssen – also mit dem soeben angelegten Style. Dazu prüfen wir wieder per If…Then-Bedingung, ob bolValidation den Wert True aufweist, und fügen dann eine der beiden Zeilen als erste Zeile des Styles hinzu:

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar