Access zu WPF: Validierung und Navigation

Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!

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:

 

Schreibe einen Kommentar