Registerkarte Properties
Neue Properties anlegen
Die Properties werden in der ClassView-Registerkarte angezeigt. Hier können neue Properties angelegt werden. Das können Sie über den Button (New) mit dem Eintrag Property bzw. Membervariable oder über das Kontext-Menü der Component (New / Property bzw. New / Membervariable) machen. Eine dritte Möglichkeit besteht darin, eine Component direkt per Drag & Drop aus dem Namespace Treeview auf die Property Tabelle zu ziehen.
Drag&Drop von Components
Ziehen Sie ein Element aus dem Namespace-TreeView auf die Property-Registerkarte. So wird ein Property angelegt und zugleich im Component-Fenster angezeigt.
Properties löschen
Properties werden ebenfalls über die Registerkarte ClassView gelöscht. Wählen Sie zunächst das zu löschende Property und anschließend aus dem Kontext-Menü den Eintrag Delete aus.
Properties kopieren
Sie können ein Property in eine andere Komponente, in ein anderes Form kopieren oder innerhalb der Komponente duplizieren. Dazu wählen Sie das gewünschte Property in der Property-Liste aus. Anschließend verwenden Sie entweder die Standardtastenkürzel Strg+C, Strg+V und Strg+X oder das Kontextmenü, um den gewünschten Kopiervorgang durchzuführen.
Properties bearbeiten
Sie können ein Property öffnen, indem Sie einen Doppelklick auf den Eintrag in der ClassView-Registerkarte machen. Alternativ können Sie auch im Component-Fenster auf der Registerkarte Property in der Tabelle das gewünschte Property auswählen.
Die Properties werden in der Tabelle sortiert, wenn Sie auf die Spaltenüberschrift des gewünschten Sortierkriteriums anklicken.
Allgemeine Properties am Property
Im Folgenden werden die allgemeinen Schaltflächen für ein Property, welche sich oberhalb der Property-Registerkarten befinden, erläutert.
Name
Bezeichnung des Properties. Über diesen Namen wird das Property im Code angesprochen.
Access Level
Legen Sie hier das Access-Level des Properties fest. Die Angabe ist analog zum .NET-Standard.
Datatype
Siehe Datentyp bearbeiten
UseInterface
Es besteht die Möglichkeit, ein Property, welches als Datatype eine Component eingestellt hat, als Interface einzubinden, um zirkulare Referenzen zu umgehen.
Wenn man an einer Component ein Property anlegt und dabei als Typ eine Component aus einem anderen Namespace verwendet, dann wird bei diesem Property automatisch die Eigenschaft UseInterface gesetzt.
Property Type
Folgende Typen stehen zur Auswahl:
• Membervariable • Generated • Generated (readonly) • Individual • Individual (readonly) • und Relation.
Diese Typen werden weiter unten genauer beschrieben.
Datentyp bearbeiten
Die Eingabe des Datentyps erfolgt über ein Textfeld mit Auto-Vervollständigung. Beim Anlegen neuer Properties wird der zuletzt ausgewählte Datentyp vorbelegt.
Diese Angabe kann nicht geändert werden, wenn dieses Property ein Mapping hat. Dann wird der Metadatentyp aus der entsprechenden Database-Column gezogen.
Tippen Sie einfach den Namen des gewünschten Datentyps ein. Elemente, die mit dem eingegebenen Text beginnen, werden in der Auto-Vervollständigungsliste angezeigt und können über die Pfeiltasten oder per Maus ausgewählt werden.
Wenn Sie den Namen eines Namespaces angeben und anschließend einen Punkt eingeben, wird die Auswahl der Vorschläge auf diesen Namespace eingeschränkt. Beispiel: „Sales.cd“ liefert alle Elemente aus dem Sales Namespace, die mit cd beginnen.
Note
Durch Verwendung des Platzhalters „%“ können Sie angeben, dass die Ergebnisse nicht mit dem danach folgenden Text anfangen müssen, sondern der Text lediglich enthalten sein muss. Beispiel: „sales.%ordertype“ liefert alle Elemente aus dem Sales Namespace, deren Name ordertype enthält, also z.B. cdOrderType.
Wird die TextBox verlassen, wird der Name des ausgewählten Elements durch den vollständig referenzierenden Namen ersetzt.
Warning
- Beim ersten Verwenden der Textbox kann es einige Sekunden dauern, bis der interne Speicher mit allen Elementen gefüllt ist.
- Es werden maximal 100 Vorschläge angeboten.
Externe Typen
Properties von Components und Data Contracts sowie Membervariablen von Forms können externe Datentypen zugewiesen werden. Wird die CheckBox „External Type“ gesetzt, wird die Autovervollständigung des Datatype-Textfeldes deaktiviert und ein beliebiger Typ kann angegeben werden (im Beispiel List<List<int>>
).
Dies bietet sich z.B. an, wenn in einem Namespace mit externen Assemblies gearbeitet wird, deren Klassen als Datentypen von Properties verwendet werden sollen.
Im IntelliSense wird beim Aufruf eines solchen Properties „object“ angezeigt, da im Hintergrund mit „object“ gearbeitet wird. Das Property „lstTest“ aus dem Beispiel kann aber z.B. trotzdem so verwendet werden:
int i = this.lstTest[0][1]; // Der Wert von i ist danach 2
Registerkarte General
In der Registerkarte General können Sie die Checkbox Autogenerate Membervariable bei Individual/Individual (readonly) Properties setzen. Wird die Checkbox aktiviert, wird automatisch eine Membervariable generiert und das entsprechende Depends on Property gesetzt.
Die Textfelder Display MinLength, Display MaxLength, Display MinLines und Display MaxLines und die Comboboxen Mapping und Drag Source befinden sich ebenfalls hier. Des Weiteren können Sie im Textfeld Description eine Beschreibung hinzufügen.
Das Control Mapping gibt das Mapping (die Verbindung) des Properties zur Query an. In der Combobox stehen hier alle Spalten (Alias) der Query zur Auswahl.
Registerkarten Get Method / Set Method
Für die Properties mit dem Type Generated, Generated (readonly), Individual, Individual (readonly) kann bei Bedarf individueller Code, der beim Setzen und Auslesen des Properties durchlaufen werden soll, programmiert werden.
Siehe hierzu Individual / Individual (readonly) Properties und Generated / Generated (readonly) Properties
Registerkarte Depends On
Auf dieser Registerkarte können Sie angeben, welches Property bspw. aus dem Auftrag mit welchem Property aus dem Kunden verbunden werden soll. Sie geben also eine Schlüsselbeziehung an, ähnlich wie Sie das auf einer relationalen Datenbank tun würden. Sie können auch mehrere Properties miteinander verknüpfen, wenn sich der Schlüssel aus mehreren Properties zusammensetzt.
Button Add: Fügt ein weiteres Property in die Relation ein. In der Tabelle wird eine neue Zeile angelegt und Sie definieren, welches Property mit welchem wie verknüpft werden soll.
Button Remove: Löscht die markierte Zeile aus der Relation.
Spalte Depends on Property: Hier wird das Property auf der Seite Component, in der Sie sich gerade befinden, angegeben. Im Beispiel wäre das ein Property des Auftrags, z.B. die „Kundennnr“.
Spalte Compare Operator: Gibt an, mit welchem Operator die Properties verknüpft werden sollen.
Spalte oXXX.Property: Gibt an, mit welchem Property der eingebundenen Component das eigene Property verknüpft werden soll. Im Beispiel wäre das evtl. „Kunde.Kundennr“.
Spalte Generated Load Condition: Zeigt die aus den anderen Spalten entstandene Suchbedingung an.
DependsOn und Individual Properties
Individual Properties hängen (meist) von anderen Properties ab und besitzen selber keinen eigenen Wert, der getracked werden kann. Dennoch müssen Individual Properties dem Form-DataBinding Bescheid geben, dass sie sich geändert haben. Hierfür gibt es zwei Möglichkeiten:
- Das Propertiy wir permanent als geändert betrachtet - das passiert, wenn keinerlei DependsOn definiert ist. Die Folge ist, dass dieses Property bei JEDEM Broker Request geprüft und das Property abgefragt wird.
- Man pflegt die DependsOn-Informationen. Damit führen Änderungen an einem der "DependsOn"-Properties dazu, dass auch das Individual Property geprüft wird - aber eben nur dann und nicht mehr bei jedem Request.
Wir empfehlen dringend das DependsOn zu pflegen, wann immer dies möglich ist. Je nach Art und Weise des Individual Properties kann das erhebliche Performance-Vorteile bringen.
Im einfachsten Fall ist es nur eine einfache Berechnung. Sollte es sich jedoch um ein Objekt handelt, welches aus der Datenbank gelesen werden muss. Und es wurde zusätzlich auch kein Caching implementiert, dann ist die Bremse perfekt.
Da das DependsOn immer wieder vergessen wird - vor allem bei einem einfachen Individual Property mit Membervariable - gibt es folgenden Mechanismus:
Note
In der Registerkarte General können Sie die Checkbox Autogenerate Membervariable bei Individual/Individual (readonly) Properties setzen. Wird die Checkbox aktiviert, wird automatisch eine Membervariable generiert und das entsprechende DependsOn-Property gesetzt.
Registerkarte Load Command
Das Load Command ist nur in Verbindung mit einem Property mit dem Type Relation Properties aktiv.
Mit den Angaben auf der Registerkarte Depends On wird Code generiert, der für das Nachlesen der Daten zuständig ist. Diesen Code können Sie überschreiben, wenn Sie eine eigene Logik wünschen.
Sind alle Angaben gemacht, wird die Relation erst beim ersten Zugriff nachgelesen. Dabei werden die gemachten Angaben berücksichtigt. Ändern sich die Inhalte der verbundenen Properties, wird erneut ein Load ausgeführt.
Warning
Derzeit können nur 1:1 Relationen abgebildet werden. D.h. es ist nicht möglich eine Collection als Relation einzubinden.
Registerkarte Control Types
Sie haben die Möglichkeit ein Standard-Control zu definieren bzw. ein zusätzliches Control hinzuzufügen.
Registerkarte Texts
Hier suchen Sie die Bezeichnung des Felds im Form aus. Sie können wählen, ob Sie die Bezeichnung aus der Database-Table bzw. dem Metadatentypen oder eine eigene Bezeichnung nehmen möchten. Die Bezeichnungen sind hierarchisch aufgebaut und können in den aufeinander aufbauenden Ebenen überschrieben werden.
Metadatatype-Labels können durch die Database-Labels überschrieben werden, Database-Labels durch die Component-Labels, Component-Labels durch die Form-Labels. Ist in einer tieferen Ebene ein Label vergeben worden, wird dieses angezeigt.
Arten von Properties
Membervariablen
Bei diesem Typ wird kein Property, sondern eine Membervariable erzeugt. Membervariablen haben keine get- und keine set-Methode.
Sie sollten nur mit dem Access-Level private versehen werden, um eine externe Manipulation zu unterbinden, da keinerlei Sicherungsmöglichkeiten nach außen definiert werden können.
Eine Membervariable wird nicht im Form-Designer angeboten. Sie sollte nur zum Merken von Informationen innerhalb der Komponente verwendet werden.
Generated / Generated (readonly) Properties
Die get- und set-Methode für das Property wird automatisch generiert, kann aber auch überdefiniert werden. Dazu muss die Checkbox Write Individual auf der Registerkarte Get Method bzw. Set Method gesetzt werden. In Getter und Setter kann mit der Hintergrundvariable this.PropertyNameValue gearbeitet werden. In Customizations sollte mit base.PropertyName gearbeitet werden, damit Getter und Setter aus dem Basis-Package nicht ausgehebelt werden.
In der Component wird auch der Original-Wert des Properties gespeichert. Wird dem Property ein Wert zugewiesen, der vom Original-Wert abweicht, wird der Status der Component auf Changed gesetzt.
Der Original-Wert kann mit PropertynameOrgValue abgefragt werden.
this.prop = „abc“;
if (this.prop != this.propOrgValue )
{ /*Wert hat sich geändert*/ }
Ist Generated (readonly) ausgewählt, steht für das Property nur die get-Methode zur Verfügung. Auf das Property kann somit nur lesend zugegriffen werden. Bei einer Wertzuweisung an das Property liefert der Compiler eine Fehlermeldung.
Hat das Property ein Mapping, verwalten die generierten get- und set-Methoden das Resultset der Query.
Ohne Mapping wird eine versteckte private Variable verwaltet.
Properties mit einem Mapping können nur auf Generated oder Generated (readonly) stehen. Ist in der Query die Spalte ’Readonly’ gecheckt, ist sogar nur Generated (readonly) möglich.
Individual / Individual (readonly) Properties
Bei diesen Typen können/müssen Sie die get- und die set-Methode manuell ausprogrammieren. Es werden in den Registerkarten Get Property und Set Property die entsprechenden Code-Felder aktiv. Der Aufruf des Setters führt nicht dazu, dass der Status der Component geändert wird.
In der Registerkarte Set Method kann bei Properties vom Typ Individual die von Framework Studio generierte Prüfung auf den Getter mit der Checkbox Check before set unterbunden werden. Eine Prüfung findet standardmäßig statt, weshalb die Checkbox per default gesetzt ist.
Bei Individual (readonly) wird nur das Code-Feld für die get-Methode aktiv.
Warning
Achten Sie darauf, dass eine Get-Methode immer einen Rückgabewert vom Typ des Properties besitzen muss.
Folgende 3 Anwendungsfälle sind denkbar (Beispiel):
1.Fall:
Sie haben z.B. einen Generated Property Status, und wollen in einem weiteren Property den Text zum Status ausgeben. Dann empfiehlt sich ein Individual (readonly) Property.
Die get-Methode könnte folgendermaßen aussehen:
if (this.Status == 1) return „offen“;
else if (this.Status == 2) return “erledigt”;
else return “”;
2. Fall:
Sie haben ein Generated Property vom Typ string, wollen aber ein int Property haben, mit dem Sie im Code arbeiten. Mit einem Individual Property können Sie dieses entsprechend verpacken:
Generated Property sType vom Typ string (z.B. mit einer Column aus der Query verbunden).
Individual Property intType vom Typ int:
get-Methode:
return Convert.ToInt32(this.sType);
set-Methode:
this.sType = Convert.ToString(value);
3. Fall:
Sie wollen ein Property anbieten, das nur bei Bedarf instanziiert und gefüllt wird. Dazu müssen Sie zum einen ein Individual (readonly) Property (z.B. oComp) anlegen und zum zweiten eine private Membervariable (z.B. oCompMember), die den nachgelesen Wert merkt, damit das Einlesen nur einmal erfolgt (Property und Membervariable müssen denselben Typ haben).
get-Methode:
if (this.oCompMember == null)
{
this.oCompMember = new cComp();
oCompMember.Load();
}
return oCompMember
Die Individual Properties müssen dem Form-DataBinding ja irgendwann mal Bescheid geben, dass sie sich geändert haben. Da sie (meist) von anderen Properties abhängen und seilber keinen eigenen Wert besitzen, der getracked werden kann, gibt es 2 Möglichkeiten: 1.) Es wir permanent als geändert betrachtet - das passiert, wenn keinerlei DependsOn definiert ist. Die Folge ist, dass dieses Property bei JEDEM Broker Request geprüft und das Property abgefragt wird. 2.) Man pflegt die DependsOn-Informationen. Damit führen dann Änderungen an einem der "DependsOn"-Properties dazu, dass auch das Individual Property grprüft wird - aber ebend nur dann und nicht mehr bei jedem Request.
Intern halten wir unsere Programmierer immer dazu an, DependsOn zu pflegen, wann immer das möglich ist. Ja nach Art und Weise des Individual Properties kann das erhebliche Performance-Vorteile bringen. Im einfachsten Fall ist es nur eine einfache Berechnung - da ist das nicht so tragisch. Wenn es sich aber um ein Objekt handelt, was aus der Datenbank gelesen werden muss und dann vielleicht auch noch kein Caching implementiert ist, dann ist die Bremse perfekt.
Gerade weil die DependsOn immer wieder vergessen werden - vor allem wenn Programmierer ein einfaches Individual Property mit Membervariable anlegen, haben wir in FS 4.3 folgende Erweiterung vorgenommen:
Registerkarte General In der Registerkarte General können Sie die Checkbox Autogenerate Membervariable bei Individual/Individual (readonly) Properties setzen. Wird die Checkbox aktiviert, wird automatisch eine Membervariable generiert und das entsprechende Depends on Property gesetzt.
Relation Properties
Die Relations dienen dazu, Ihre Komponenten miteinander zu verbinden. (Wenn Sie z.B. einen Auftrag und einen Kunden haben, ist es in der Regel so, dass der Auftrag eine Kundennummer hat, die angibt, welcher Kunde den Auftrag erteilt hat.)
Relations stellen eine Möglichkeit dar, diese beiden Komponenten miteinander zu verbinden. Dazu wird im Auftrag beispielsweise ein Property Kunde angelegt. Dieses Property muss dem Typ Relation entsprechen. Anschließend müssen noch Angaben darüber gemacht werden, wie die beiden Komponenten miteinander verbunden sind.
Warning
Achten Sie darauf, dass als Datatype eine Component ausgewählt ist, da Sie andernfalls Relation nicht als Property Type auswählen können.