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.
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: