Duplizieren vorhandener Steuerelemente
Allgemeine Beschreibung
Diese Seite beschreibt eine Methode, mit der innerhalb einer Menü-Funktion bestimmte Steuerelemente dupliziert werden können. Entstanden ist dies aus dem Kundenwunsch heraus, verschiedene Steuerelemente, die in der Artikel-Verwaltung im Detailbereich auf verschiedenen Registerkarten untergebracht sind, auf einer eigenen Registerkarte zusammen unterzubringen. Dabei sollen diese aber nicht verschoben, sondern auf die eigene Registerkarte kopiert werden, so dass sie sich sowohl von ihrem Originalplatz als auch aus der eigenen Registerkarte heraus bedienen lassen und der Inhalt gleich gehalten wird.
Realisierung
Das duplizierte Steuerelement kann z.B. dynamisch durch Programmierung an beliebiger Stelle eingefügt, bei vererbten Forms im Designer frei platziert oder in einer eigenen Registerkarte per Designer eingesetzt werden. Es muss sich dabei um ein Ewa-Steuerelement handeln, z.B. 'EwaTextBox'.
Um sich gewisse notwendige Werte zu merken, wird eine bei Ewa-Steuerelementen vorhandene Eigenschaft 'EwaTag' verwendet. Darin wird die Klasse 'DuplizierenTag' abgelegt, in der Informationen enthalten sind, ob es sich um ein Original-Steuerelement oder eine Kopie handelt, wer das Ziel-Steuerelement ist (am originalen ist als Ziel das kopierte und am kopierten ist das originale Steuerelement abgespeichert) und noch ein Kennzeichen 'DuplizierenAusführen', ob das Kopieren des Inhaltes tatsächlich durchgeführt werden soll.
Die eigentliche Kopie der Daten sowie die Umformatierung bzgl. Fett-Schrift übernimmt die Klasse 'DatenDuplizieren'. Über Handler wird diese sowohl an das Ziel- als auch an das Original-Steuerelement auf das Ereignis 'EwaValueChanged' gebunden. Somit wird das Duplizieren der Daten sowohl bei Änderungen durch den Anwender als auch bei Änderungen durch easyWinArt selbst (z.B. Blättern in der Suchliste) durchgeführt. Da das Ereignis immer bei beiden Steuerlelementen angestoßen wird, verhindert eine If-Verzweigung im Zusammenspiel mit oben genanntem Kennzeichen 'DuplizierenAusführen', das die Daten direkt wieder zurückkopiert werden und somit eine Endlosschleife entsteht.
Die Einstellungen an den Steuerelementen sowie die Handler sind im Ereignis 'StartForm' vorzunehmen, damit diese schon mit dem Öffnen einer Menüfunktion gültig sind und die Steuerelemente wie gewünscht funktionieren. Das gesamte untere Beispiel ist in die Datei 'TriggerFormFramework' einzufügen.
Bei einer EwaComboBox sind einige Besonderheiten notwendig, da sie als Auswahlfeld mit Werten zur Auswahl ausgestattet ist. Diese müssen in den Ereignissen 'NachAktualisieren' und 'NachDatensatzChangedMultiEreignis' (nur NachLoad) an das duplizierte Steuerelement übernommen werden.
Im unteren Beispiel wird die Artikel-Verwaltung zu Demonstrationszwecken um fünf Steuerelemente erweitert, diese werden programmiertechnisch eingefügt in folgenden Registerkarten:
- Registerkarte 'Konten der Finanzbuchhaltung': ComboBoxKontoNummer_FibuKontenrahmenEinkauf - Registerkarte 'Fracht-Zoll-Außenhandel-INTRASTAT': TextBoxUrsprungsland - Registerkarte 'Verkaufs/Einkaufs-Sonderpreise': DoubleBoxSonderPreisVK - Registerkarte 'Verkaufs/Einkaufs-Sonderpreise': DatePickerSonderPreisEKBisDatum - Registerkarte 'Web-Shop-Daten': CheckBoxWebShop1Artikel
VB.NET SDK-Programmcode
#Region " TriggerFormFramework_StartForm-Ereignis "
Private Sub TriggerFormFramework_StartForm(ByVal sender As Object, ByVal e As FormFrameworkEventArgs) Handles Me.StartForm
'>>> Bei Menüfunktion A R T I K E L
If TypeOf sender Is ArtikelFRM Then
Dim ArtFRM As ArtikelFRM
ArtFRM = DirectCast(sender, ArtikelFRM)
'>>> #############################################################################################
'>>> T E X T B O X
'>>> Demo-Textbox anlegen
Dim neueTextBox As New EwaTextBox
ArtFRM.TextBoxUrsprungsland.Width = 80
ArtFRM.TextBoxUrsprungsland.Anchor = CType(AnchorStyles.Left + AnchorStyles.Top, AnchorStyles)
neueTextBox.Top = ArtFRM.TextBoxUrsprungsland.Top
neueTextBox.Width = 80
neueTextBox.Left = ArtFRM.TextBoxUrsprungsland.Left + 80 + 20
neueTextBox.Name = "A_" & ArtFRM.TextBoxUrsprungsland.Name
ArtFRM.GroupBoxAußenhandel.Controls.Add(neueTextBox)
'>>> Pseudo-Datenbindung für Demo-TextBox
Dim neueTextBoxTag As New DuplizierenTag
neueTextBoxTag.Zielsteuerelement = neueTextBox
ArtFRM.TextBoxUrsprungsland.EwaTag = neueTextBoxTag
AddHandler ArtFRM.TextBoxUrsprungsland.EwaValueChanged, AddressOf Me.DatenDuplizieren
neueTextBoxTag = New DuplizierenTag
neueTextBoxTag.Zielsteuerelement = ArtFRM.TextBoxUrsprungsland
neueTextBoxTag.OriginalEwaSteuerelement = False
neueTextBox.EwaTag = neueTextBoxTag
AddHandler neueTextBox.EwaValueChanged, AddressOf Me.DatenDuplizieren
'>>> #############################################################################################
'>>> C H E C K B O X
'>>> Demo-Checkbox anlegen
Dim neueCheckbox As New EwaCheckBox
ArtFRM.CheckBoxWebShop1Artikel.Anchor = CType(AnchorStyles.Left + AnchorStyles.Top, AnchorStyles)
ArtFRM.CheckBoxWebShop1Artikel.Width = 155
neueCheckbox.Top = ArtFRM.CheckBoxWebShop1Artikel.Top
neueCheckbox.Left = ArtFRM.CheckBoxWebShop1Artikel.Left + ArtFRM.CheckBoxWebShop1Artikel.Width + 20
neueCheckbox.Text = "TestCheckBox"
neueCheckbox.Name = "A_" & ArtFRM.CheckBoxWebShop1Artikel.Name
ArtFRM.GroupBoxWebShopKennzeichen.Controls.Add(neueCheckbox)
'>>> Pseudo-Datenbindung für Demo-Checkbox
Dim neueCheckboxTag As New DuplizierenTag
neueCheckboxTag.Zielsteuerelement = neueCheckbox
ArtFRM.CheckBoxWebShop1Artikel.EwaTag = neueCheckboxTag
AddHandler ArtFRM.CheckBoxWebShop1Artikel.EwaValueChanged, AddressOf Me.DatenDuplizieren
neueCheckboxTag = New DuplizierenTag
neueCheckboxTag.Zielsteuerelement = ArtFRM.CheckBoxWebShop1Artikel
neueCheckboxTag.OriginalEwaSteuerelement = False
neueCheckbox.EwaTag = neueCheckboxTag
AddHandler neueCheckbox.EwaValueChanged, AddressOf Me.DatenDuplizieren
'>>> #############################################################################################
'>>> C O M B O B O X
'>>> Demo-ComboBox anlegen
Dim neueComboBox As New EwaComboBox
ArtFRM.GroupBoxFinanzbuchhaltungEinkauf.Height += 50
neueComboBox.Top = ArtFRM.ComboBoxKontoNummer_FibuKontenrahmenEinkauf.Top + 30
neueComboBox.Left = ArtFRM.ComboBoxKürzel_FibuKontenGruppenEinkauf.Left
neueComboBox.Width = ArtFRM.ComboBoxKürzel_FibuKontenGruppenEinkauf.Width
neueComboBox.Name = "A_" & ArtFRM.ComboBoxKontoNummer_FibuKontenrahmenEinkauf.Name
ArtFRM.GroupBoxFinanzbuchhaltungEinkauf.Controls.Add(neueComboBox)
'>>> Pseudo-Datenbindung für Demo-ComboBox
Dim neueComboBoxTag As New DuplizierenTag
neueComboBoxTag.Zielsteuerelement = neueComboBox
ArtFRM.ComboBoxKontoNummer_FibuKontenrahmenEinkauf.EwaTag = neueComboBoxTag
AddHandler ArtFRM.ComboBoxKontoNummer_FibuKontenrahmenEinkauf.EwaValueChanged, AddressOf Me.DatenDuplizieren
neueComboBoxTag = New DuplizierenTag
neueComboBoxTag.Zielsteuerelement = ArtFRM.ComboBoxKontoNummer_FibuKontenrahmenEinkauf
neueComboBoxTag.OriginalEwaSteuerelement = False
neueComboBox.EwaTag = neueComboBoxTag
AddHandler neueComboBox.EwaValueChanged, AddressOf Me.DatenDuplizieren
'>>> #############################################################################################
'>>> D A T E P I C K E R
'>>> Demo-DatePicker anlegen
Dim neuerDatePicker As New EwaDatePicker
ArtFRM.GroupBoxSonderpreiseEK.Height += 50
neuerDatePicker.Left = ArtFRM.DatePickerSonderPreisEKBisDatum.Left
neuerDatePicker.Top = ArtFRM.DatePickerSonderPreisEKBisDatum.Top + 40
neuerDatePicker.Name = "A_" & ArtFRM.DatePickerSonderPreisEKBisDatum.Name
ArtFRM.GroupBoxSonderpreiseEK.Controls.Add(neuerDatePicker)
'>>> Pseudo-Datenbindung für Demo-DatePicker
Dim neuerDatePickerTag As New DuplizierenTag
neuerDatePickerTag.Zielsteuerelement = neuerDatePicker
ArtFRM.DatePickerSonderPreisEKBisDatum.EwaTag = neuerDatePickerTag
AddHandler ArtFRM.DatePickerSonderPreisEKBisDatum.EwaValueChanged, AddressOf Me.DatenDuplizieren
neuerDatePickerTag = New DuplizierenTag
neuerDatePickerTag.Zielsteuerelement = ArtFRM.DatePickerSonderPreisEKBisDatum
neuerDatePickerTag.OriginalEwaSteuerelement = False
neuerDatePicker.EwaTag = neuerDatePickerTag
AddHandler neuerDatePicker.EwaValueChanged, AddressOf Me.DatenDuplizieren
'>>> #############################################################################################
'>>> D O U B L E B O X
'>>> Demo-DoubleBox anlegen
Dim neueDoubleBox As New EwaDoubleBox
neueDoubleBox.Left = ArtFRM.DoubleBoxSonderPreisEK.Left
neueDoubleBox.Width = ArtFRM.DoubleBoxSonderPreisEK.Width
neueDoubleBox.Top = ArtFRM.DoubleBoxSonderPreisEK.Top + 80
neueDoubleBox.Name = "A_" & ArtFRM.DoubleBoxSonderPreisEK.Name
ArtFRM.GroupBoxSonderpreiseEK.Controls.Add(neueDoubleBox)
'>>> Pseudo-Datenbindung für Demo-DoubleBox
Dim neueDoubleBoxTag As New DuplizierenTag
neueDoubleBoxTag.Zielsteuerelement = neueDoubleBox
ArtFRM.DoubleBoxSonderPreisEK.EwaTag = neueDoubleBoxTag
AddHandler ArtFRM.DoubleBoxSonderPreisEK.EwaValueChanged, AddressOf Me.DatenDuplizieren
neueDoubleBoxTag = New DuplizierenTag
neueDoubleBoxTag.Zielsteuerelement = ArtFRM.DoubleBoxSonderPreisEK
neueDoubleBoxTag.OriginalEwaSteuerelement = False
neueDoubleBox.EwaTag = neueDoubleBoxTag
AddHandler neueDoubleBox.EwaValueChanged, AddressOf Me.DatenDuplizieren
End If
End Sub
#End Region
#Region " TriggerFormFramework_NachAktualisieren-Ereignis "
Private Sub TriggerFormFramework_NachAktualisieren(ByVal sender As Object, ByVal e As FormFrameworkAktualisierenEventArgs) Handles Me.NachAktualisieren
'>>> Bei Menüfunktion A R T I K E L
If TypeOf sender Is ArtikelFRM Then
Dim ArtFRM As ArtikelFRM
ArtFRM = DirectCast(sender, ArtikelFRM)
'>>> Daten der ComboBox 'FibuKontenrahmenEinkauf' in die kopierte ComboBox übernehmen
ZielComboBoxEinträgeInitialisieren(ArtFRM.ComboBoxKontoNummer_FibuKontenrahmenEinkauf)
End If
End Sub
#End Region
#Region " TriggerFormFramework_NachDatensatzChangedMultiEreignis-Ereignis "
Private Sub TriggerFormFramework_NachDatensatzChangedMultiEreignis(ByVal sender As Object, ByVal e As FormFrameworkMultiEventArgs) Handles Me.NachDatensatzChangedMultiEreignis
'>>> Nur beim Ereignis-Typ N a c h L o a d
If e.EreignisTyp = MultiEventTyp.NachLoad Then
'>>> Bei Menüfunktion A R T I K E L
If TypeOf sender Is ArtikelFRM Then
Dim ArtFRM As ArtikelFRM
ArtFRM = DirectCast(sender, ArtikelFRM)
'>>> Daten der ComboBox 'FibuKontenrahmenEinkauf' in die kopierte ComboBox übernehmen
ZielComboBoxEinträgeInitialisieren(ArtFRM.ComboBoxKontoNummer_FibuKontenrahmenEinkauf)
End If
End If
End Sub
#End Region
#Region " Private Sub: DatenDuplizieren (Daten eines Steuerelementes in sein zugehöriges Ziel-Steuerelement übernehmen) "
Private Sub DatenDuplizieren(ByVal sender As Object, ByVal e As System.EventArgs)
'>>> Funktioniert in beide Richtungen, also von Original-easyWinArt-Steuerelement in das kopierte Steuerelement und auch andersherum
Dim zielSteuerelementAllgemein As IEwaControl
Dim zielFeldTag As DuplizierenTag
Dim meineForm As BasisForm = CType(CType(sender, Control).FindForm, BasisForm)
Dim quellSteuerelementAllgemein As IEwaControl = CType(sender, IEwaControl)
Dim quellFeldTag As DuplizierenTag = CType(quellSteuerelementAllgemein.EwaTag, DuplizierenTag)
'>>> Nur ausführen bei Änderungen am Quell-Element, nicht am Ziel-Element, sonst Endlosschleife
If quellFeldTag.DuplizierenAusführen Then
zielSteuerelementAllgemein = CType(quellFeldTag.Zielsteuerelement, IEwaControl)
'>>> ValueChangedReaktion beim Ziel-Steuerelement verhindern (Häckchen beim Ziel setzen)
zielFeldTag = CType(zielSteuerelementAllgemein.EwaTag, DuplizierenTag)
zielFeldTag.DuplizierenAusführen = False
zielSteuerelementAllgemein.EwaTag = zielFeldTag
'>>> Konkreten Typ feststellen und entsprechend Daten-Duplizierung vornehmen
'>>> (lässt sich aufgrund der verschiedenen Steuerelemente nicht kürzer programmieren)
'>>> #############################################################################################
'>>> C H E C K B O X
If quellSteuerelementAllgemein.EwaTyp = EwaCtrlTyp.CheckBox Then
Dim quellSteuerelement As EwaCheckBox = CType(quellSteuerelementAllgemein, EwaCheckBox)
Dim zielSteuerelement As EwaCheckBox = CType(zielSteuerelementAllgemein, EwaCheckBox)
'>>> Wert von Quell-Steuerelement in Ziel-Steuerelement hineinsetzen
meineForm.BasisFkt.SetzeControl(zielSteuerelementAllgemein, quellSteuerelement.Checked)
zielFeldTag.DuplizierenAusführen = True
zielSteuerelementAllgemein.EwaTag = zielFeldTag
'>>> Schriftgewichtung der beiden Steuerelemente synchronisieren
If quellFeldTag.OriginalEwaSteuerelement Then
zielSteuerelement.Font = quellSteuerelement.Font
Else
quellSteuerelement.Font = zielSteuerelement.Font
End If
End If
'>>> #############################################################################################
'>>> T E X T B O X
If quellSteuerelementAllgemein.EwaTyp = EwaCtrlTyp.TextBox Then
Dim quellSteuerlement As EwaTextBox = CType(quellSteuerelementAllgemein, EwaTextBox)
Dim zielSteuerlement As EwaTextBox = CType(zielSteuerelementAllgemein, EwaTextBox)
'>>> Wert von Quell-Steuerelement in Ziel-Steuerelement hineinsetzen
meineForm.BasisFkt.SetzeControl(zielSteuerlement, quellSteuerlement.Text)
zielFeldTag.DuplizierenAusführen = True
zielSteuerelementAllgemein.EwaTag = zielFeldTag
'>>> Schriftgewichtung der beiden Steuerelemente synchronisieren
If quellFeldTag.OriginalEwaSteuerelement Then
zielSteuerlement.Font = quellSteuerlement.Font
Else
quellSteuerlement.Font = zielSteuerlement.Font
End If
End If
'>>> #############################################################################################
'>>> C O M B O B O X
If quellSteuerelementAllgemein.EwaTyp = EwaCtrlTyp.ComboBox Then
Dim quellSteuerlement As EwaComboBox = CType(quellSteuerelementAllgemein, EwaComboBox)
Dim zielSteuerlement As EwaComboBox = CType(zielSteuerelementAllgemein, EwaComboBox)
'>>> Wert von Quell-Steuerelement in Ziel-Steuerelement hineinsetzen
meineForm.BasisFkt.SetzeControl(zielSteuerelementAllgemein, quellSteuerlement.Text)
zielFeldTag.DuplizierenAusführen = True
zielSteuerelementAllgemein.EwaTag = zielFeldTag
'>>> Schriftgewichtung der beiden Steuerelemente synchronisieren
If quellFeldTag.OriginalEwaSteuerelement Then
zielSteuerlement.Font = quellSteuerlement.Font
Else
quellSteuerlement.Font = zielSteuerlement.Font
End If
End If
'>>> #############################################################################################
'>>> D A T E P I C K E R
If quellSteuerelementAllgemein.EwaTyp = EwaCtrlTyp.DatePicker Then
Dim quellSteuerlement As EwaDatePicker = CType(quellSteuerelementAllgemein, EwaDatePicker)
Dim zielSteuerlement As EwaDatePicker = CType(zielSteuerelementAllgemein, EwaDatePicker)
'>>> Wert von Quell-Steuerelement in Ziel-Steuerelement hineinsetzen
meineForm.BasisFkt.SetzeControl(zielSteuerelementAllgemein, quellSteuerlement.Text)
zielFeldTag.DuplizierenAusführen = True
zielSteuerelementAllgemein.EwaTag = zielFeldTag
'>>> Schriftgewichtung der beiden Steuerelemente synchronisieren
If quellFeldTag.OriginalEwaSteuerelement Then
zielSteuerlement.Font = quellSteuerlement.Font
Else
quellSteuerlement.Font = zielSteuerlement.Font
End If
End If
'>>> #############################################################################################
'>>> T I M E P I C K E R
If quellSteuerelementAllgemein.EwaTyp = EwaCtrlTyp.TimePicker Then
Dim quellSteuerlement As EwaTimePicker = CType(quellSteuerelementAllgemein, EwaTimePicker)
Dim zielSteuerlement As EwaTimePicker = CType(zielSteuerelementAllgemein, EwaTimePicker)
'>>> Wert von Quell-Steuerelement in Ziel-Steuerelement hineinsetzen
meineForm.BasisFkt.SetzeControl(zielSteuerelementAllgemein, quellSteuerlement.Text)
zielFeldTag.DuplizierenAusführen = True
zielSteuerelementAllgemein.EwaTag = zielFeldTag
'>>> Schriftgewichtung der beiden Steuerelemente synchronisieren
If quellFeldTag.OriginalEwaSteuerelement Then
zielSteuerlement.Font = quellSteuerlement.Font
Else
quellSteuerlement.Font = zielSteuerlement.Font
End If
End If
'>>> #############################################################################################
'>>> I N T E G E R B O X
If quellSteuerelementAllgemein.EwaTyp = EwaCtrlTyp.IntegerBox Then
Dim quellSteuerlement As EwaIntegerBox = CType(quellSteuerelementAllgemein, EwaIntegerBox)
Dim zielSteuerlement As EwaIntegerBox = CType(zielSteuerelementAllgemein, EwaIntegerBox)
'>>> Wert von Quell-Steuerelement in Ziel-Steuerelement hineinsetzen
meineForm.BasisFkt.SetzeControl(zielSteuerelementAllgemein, quellSteuerlement.Text)
zielFeldTag.DuplizierenAusführen = True
zielSteuerelementAllgemein.EwaTag = zielFeldTag
'>>> Schriftgewichtung der beiden Steuerelemente synchronisieren
If quellFeldTag.OriginalEwaSteuerelement Then
zielSteuerlement.Font = quellSteuerlement.Font
Else
quellSteuerlement.Font = zielSteuerlement.Font
End If
End If
'>>> #############################################################################################
'>>> D O U B L E B O X
If quellSteuerelementAllgemein.EwaTyp = EwaCtrlTyp.DoubleBox Then
Dim quellSteuerlement As EwaDoubleBox = CType(quellSteuerelementAllgemein, EwaDoubleBox)
Dim zielSteuerlement As EwaDoubleBox = CType(zielSteuerelementAllgemein, EwaDoubleBox)
'>>> Wert von Quell-Steuerelement in Ziel-Steuerelement hineinsetzen
meineForm.BasisFkt.SetzeControl(zielSteuerelementAllgemein, quellSteuerlement.Text)
zielFeldTag.DuplizierenAusführen = True
zielSteuerelementAllgemein.EwaTag = zielFeldTag
'>>> Schriftgewichtung der beiden Steuerelemente synchronisieren
If quellFeldTag.OriginalEwaSteuerelement Then
zielSteuerlement.Font = quellSteuerlement.Font
Else
quellSteuerlement.Font = zielSteuerlement.Font
End If
End If
'>>> #############################################################################################
End If
End Sub
#End Region
#Region " Private Sub: ComboBoxInhaltDuplizieren (Übernimmt alle Einträge der Quell-ComboBox in die Ziel-ComboBox) "
Private Sub ZielComboBoxEinträgeInitialisieren(ByRef QuellComboBox As EwaComboBox)
Dim quellFeldTag As DuplizierenTag = CType(QuellComboBox.EwaTag, DuplizierenTag)
Dim zielComboBox As EwaComboBox = CType(quellFeldTag.Zielsteuerelement, EwaComboBox)
zielComboBox.Items.Clear()
zielComboBox.EwaWerteAL = QuellComboBox.EwaWerteAL
'>>> Alle Einträge der Quell-ComboBox durchlaufen und in die Ziel-ComboBox übernehmen
For Each item In QuellComboBox.Items
zielComboBox.Items.Add(item)
Next
End Sub
#End Region
#Region " Class DuplizierenTag "
Class DuplizierenTag
Friend DuplizierenAusführen As Boolean = True
Friend Zielsteuerelement As IEwaControl
Friend OriginalEwaSteuerelement As Boolean = True
End Class
#End Region