Code-abgeleiteten Spalten in Eco ii

Code-abgeleiteten Spalten in Eco ii


Erklärt, was Code abgeleitete Spalten sind und wie man sie benutzt.

Der Schwerpunkt dieses Artikels werden 'Ereignis abgeleitete Spalten'. Jan Nordén (Borland) wies mich in die Richtung von diesen Dingen, vor kurzem, als ich ihn fragte, wie eine GUI-Problem zu lösen, die ich hatte. Wenn ich es kühn für Delphi verwendet wurde diese wirklich schöne GUI-Komponente ein BoldSelectionListBox genannt. Diese Komponente würde mir eine Liste von Elementen mit einem Kontrollkästchen neben jeder Zeile anzeigen lassen, Inlett / Haken eine Box würde hinzufügen / entfernen ein Elements Assoziation zwischen das Elementobjekt ausgewählten sowie einige weitere meiner Wahl. Das ist nicht die beste Erklärung der Welt, also schauen Sie sich das folgende UML-Diagramm:

Click to enlarge

Dieses Diagramm ist etwas, das ich vor kurzem in ECO II gearbeitet haben. Es ist meine Interpretation der Informationen erforderlich, um eine induktive Benutzeroberfläche zu erstellen. Blick auf das UML-Diagramm eng Sie sehen, dass jede Aufgabe NULL oder viele PermittedRoles (Rolle) verweist. Die Idee, dass durch die Rolle des aktuellen Benutzers angeben kann ich leicht erhalten eine Liste der Aufgaben, die sie ausführen dürfen.

Mit dieser BoldSelectionListBox wäre ich in der Lage, eine Aufgabe als Kontext angeben, und dann noch eine Liste aller Rollen in einer Art CheckListBox. Zecken würde in alle Kontrollkästchen, wenn die Rolle zulässig ist, zum Ausführen der Aktion aufgeführt, und keine Häkchen angezeigt, wo ist es nicht. Der zusätzliche Clou ist natürlich, dass durch Ankreuzen eine CheckBox kühn würde das Link-Objekt benötigt, um die Rolle der Aufgabe zu binden und zu Role.AllowedTasks (und natürlich Task.PermittedRoles) hinzufügen.

Sehen, dass ECO II keine GUI-Steuerelemente eingeführt wird (es bietet stattdessen net DataBinding Schnittstellen, so dass Sie Standardsteuerelemente verwenden können), ich vermutete, dass ich nicht in der Lage, die gleiche Art von Effekt zu erreichen wäre. Freundlicherweise Jan schickte mir eine kleine Demo zeigt, wie man dies zu erreichen, verwenden nur DataGrids. Bald hatte ich diese Logik in meinem eigenen app geschrieben, und es war schön!

Fügte Ausdruck Griffe für meine Rollen (EhRoles) und Aufgaben (EhTasks), verknüpfte sie bis zu einem Gitter und hinzugefügt Hinzufügen / Löschen von Schaltflächen. Ich habe jedes dieser Ausdruck-Handles, alle Instanzen, 'Roles.allInstances' und 'Tasks.allInstances' abzurufen.

Auf der linken Seite über meine GUI hatte ich alle meine Aufgaben aufgelistet, und auf der rechten Seite hatte ich alle meine Rollen. Ich wollte jetzt fügen Sie ein Kontrollkästchen neben jeder Rolle, so dass ich kann angeben, ob die Rollen auf den aktuell ausgewählten Task ausführen oder nicht berechtigt war. Das erste Problem anzugehen ist zu wissen, welche Aufgabe die 'ausgewählten' ist. Zu diesem Zweck hinzugefügt ein CurrencyManagerHandle namens 'ChTasks', legte ich seine RootHandle zu EhTasks und seine BindingContext auf TasksDataGrid. ChTasks hält nun die aktuelle Aufgabe, nett und einfach.

Als nächstes musste ich eine CheckBox-Spalte in meine RolesDataGrid bekommen und AllowNull auf False festgelegt. Dazu ich eine gefälschte TaskPermitted Spalte EhRoles hinzugefügt und legen Sie deren Typ System.Boolean. Hinweis: Die Schaltfläche 'Hinzufügen' in der Spalten-Editor wird ein DropDown neben dem Symbol, klicken, und wählen Sie EventDerivedColumn. Anschließend wurde die zusätzliche Spalte zu meinem RolesDataGrid, um sicherzustellen, dass es war eine CheckBox, wählte ich die DropDown-Liste auf die Schaltfläche 'hinzufügen' und ausgewählte DataGridBoolColumn hinzugefügt. Legen Sie den MappingName für TaskPermitted.

Bisher haben wir alles, was wir brauchen, sehen die Checkboxen, aber keine Möglichkeit, das DataGrid mitzuteilen, ob die Checkbox angekreuzt werden sollten. Dazu müssen wir in der EhRoles' DeriveValue Ereignis Code schreiben, aber zuerst möchte ich etwas, um den Code ein wenig leichter zu schreiben hinzufügen. Ich habe eine neue ExpressionHandle-EhTasksPermittedRoles, die RootHandle war die CurrencyHandle (ChTasks) und war des Ausdrucks 'selbst. PermittedRoles'. Dadurch wäre mir leicht überprüfen, die Rollen auf den 'aktuellen'Task ausführen dürfen.

Nun zum Code schreiben, um den Wert der ehRoles.TaskPermitted berechnen. Dies geschieht in der ehRoles.DeriveValue-Veranstaltung, etwa so:

private void EhRoles_DeriveValue (Object Sender, Borland.Eco.Handles.DeriveEventArgs e)
{
Switch (e.Name) //One Ereignis für alle abgeleiteten Spalten

{
Fall 'TaskPermitted':
Erhalten Sie eine Liste der zulässigen Rollen für diese Aufgabe

IElementCollection Rollen = ehTasksPermittedRoles.Element als IElementCollection;

Vermeiden Sie eine null-Verweisausnahme

Wenn (Rollen == Null)
{
ein Element, darstellt die Konstante 'False' zurück
e.ResultElement = EcoSpace.VariableFactoryService.CreateConstant(false);
zurück;
}

Das EhTaskPermittedRoles-Element, das sagt uns zu beobachten wenn das Element
ändert, so dass wir die GUI ungültig machen
ehTasksPermittedRoles.SubscribeToElement(e.ResubscribeSubscriber);

Beachten Sie auch die Elemente in der Liste
-Rollen. SubscribeToValue(e.ValueChangeSubscriber);

Wenn die zulässigen Rollen enthält die aktuelle Rolle dann zurück
ein Element, das die Konstante 'True' darstellt

Wenn (Rollen. Contains(e.RootElement))
e.ResultElement = EcoSpace.VariableFactoryService.CreateConstant(true);
sonst
Andernfalls ein Element darstellt die Konstante 'False' zurück
e.ResultElement = EcoSpace.VariableFactoryService.CreateConstant(false);

zu brechen;

Standard:
neue Ausnahme (e.Name + 'nicht ordnungsgemäß abgeleitet');
} //switch
} //ehRoles_DeriveValue

Und schließlich brauchen wir eine Möglichkeit, dass der Benutzer zu kreuzen / deaktivieren ein Kontrollkästchens und haben der relevanten Verein hinzugefügt oder aus der Task.PermittedRoles entfernt. Dies geschieht in der ehRoles.ReverseDeriveValue-Veranstaltung, etwa so

private void EhRoles_ReverseDeriveValue (Object Sender, Borland.Eco.Handles.ReverseDeriveEventArgs e)
{
Switch(e.Name) //One Ereignis für alle abgeleiteten Spalten
{
Fall 'TaskPermitted':
Erhalten Sie eine Liste der zulässigen Rollen für die aktuelle Aufgabe
IElementCollection Rollen = (IElementCollection) ehTasksPermittedRoles.Element;

Vermeiden Sie eine null-Verweisausnahme
Wenn (Rollen == Null)
zurück;

Typumwandlung den Wert festgelegt wird, in einen booleschen Wert (von der Datagrid CheckBox)
Wenn ((booleschen) e.Value)
{
Wenn die Checkbox aktiviert wurde und die angeklickte Rolle nicht in ist der
Task.PermittedRoles-Liste hinzufügen
Wenn (! Rollen. Contains(e.RootElement))
-Rollen. Add(e.RootElement);
}
sonst
{
Wenn das Kontrollkästchen nicht aktiviert wurde und die angeklickte Rolle vorhanden in ist der
Task.PermittedRoles-Liste entfernen Sie es
Wenn (Rollen. Contains(e.RootElement))
-Rollen. Remove(e.RootElement);
}
zu brechen;
} //switch
} //ehRoles_ReverseDeriveValue

Es dauert ein wenig gewöhnungsbedürftig, aber wenn Sie lesen, dass es durch ein paar Mal Sie Jist davon bekommen kann. Dies bringt im Grunde dem Entwickler das umgekehrte abgeleitete Attribute zur Verwendung ausschließlich innerhalb der GUI. Dies bedeutet, dass wir einige clevere Dinge mit ECO II-Objekte können ohne umgekehrte abgeleitete Attribute im Modell enthalten, um GUI-Anforderungen entsprechen.








Code-abgeleiteten Spalten in Eco ii


Code-abgeleiteten Spalten in Eco ii : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Erklärt, was Code abgeleitete Spalten sind und wie man sie benutzt.

Der Schwerpunkt dieses Artikels werden 'Ereignis abgeleitete Spalten'. Jan Norden (Borland) wies mich in die Richtung von diesen Dingen, vor kurzem, als ich ihn fragte, wie eine GUI-Problem zu lösen, die ich hatte. Wenn ich es kühn für Delphi verwendet wurde diese wirklich schöne GUI-Komponente ein BoldSelectionListBox genannt. Diese Komponente würde mir eine Liste von Elementen mit einem Kontrollkästchen neben jeder Zeile anzeigen lassen, Inlett / Haken eine Box würde hinzufügen / entfernen ein Elements Assoziation zwischen das Elementobjekt ausgewählten sowie einige weitere meiner Wahl. Das ist nicht die beste Erklärung der Welt, also schauen Sie sich das folgende UML-Diagramm:

Click to enlarge

Dieses Diagramm ist etwas, das ich vor kurzem in ECO II gearbeitet haben. Es ist meine Interpretation der Informationen erforderlich, um eine induktive Benutzeroberfläche zu erstellen. Blick auf das UML-Diagramm eng Sie sehen, dass jede Aufgabe NULL oder viele PermittedRoles (Rolle) verweist. Die Idee, dass durch die Rolle des aktuellen Benutzers angeben kann ich leicht erhalten eine Liste der Aufgaben, die sie ausführen dürfen.

Mit dieser BoldSelectionListBox wäre ich in der Lage, eine Aufgabe als Kontext angeben, und dann noch eine Liste aller Rollen in einer Art CheckListBox. Zecken würde in alle Kontrollkästchen, wenn die Rolle zulässig ist, zum Ausführen der Aktion aufgeführt, und keine Häkchen angezeigt, wo ist es nicht. Der zusätzliche Clou ist natürlich, dass durch Ankreuzen eine CheckBox kühn würde das Link-Objekt benötigt, um die Rolle der Aufgabe zu binden und zu Role.AllowedTasks (und natürlich Task.PermittedRoles) hinzufügen.

Sehen, dass ECO II keine GUI-Steuerelemente eingeführt wird (es bietet stattdessen net DataBinding Schnittstellen, so dass Sie Standardsteuerelemente verwenden können), ich vermutete, dass ich nicht in der Lage, die gleiche Art von Effekt zu erreichen wäre. Freundlicherweise Jan schickte mir eine kleine Demo zeigt, wie man dies zu erreichen, verwenden nur DataGrids. Bald hatte ich diese Logik in meinem eigenen app geschrieben, und es war schön!

Fügte Ausdruck Griffe für meine Rollen (EhRoles) und Aufgaben (EhTasks), verknüpfte sie bis zu einem Gitter und hinzugefügt Hinzufügen / Löschen von Schaltflächen. Ich habe jedes dieser Ausdruck-Handles, alle Instanzen, 'Roles.allInstances' und 'Tasks.allInstances' abzurufen.

Auf der linken Seite über meine GUI hatte ich alle meine Aufgaben aufgelistet, und auf der rechten Seite hatte ich alle meine Rollen. Ich wollte jetzt fügen Sie ein Kontrollkästchen neben jeder Rolle, so dass ich kann angeben, ob die Rollen auf den aktuell ausgewählten Task ausführen oder nicht berechtigt war. Das erste Problem anzugehen ist zu wissen, welche Aufgabe die 'ausgewählten' ist. Zu diesem Zweck hinzugefügt ein CurrencyManagerHandle namens 'ChTasks', legte ich seine RootHandle zu EhTasks und seine BindingContext auf TasksDataGrid. ChTasks hält nun die aktuelle Aufgabe, nett und einfach.

Als nächstes musste ich eine CheckBox-Spalte in meine RolesDataGrid bekommen und AllowNull auf False festgelegt. Dazu ich eine gefälschte TaskPermitted Spalte EhRoles hinzugefügt und legen Sie deren Typ System.Boolean. Hinweis: Die Schaltfläche 'Hinzufügen' in der Spalten-Editor wird ein DropDown neben dem Symbol, klicken, und wählen Sie EventDerivedColumn. Anschließend wurde die zusätzliche Spalte zu meinem RolesDataGrid, um sicherzustellen, dass es war eine CheckBox, wählte ich die DropDown-Liste auf die Schaltfläche 'hinzufügen' und ausgewählte DataGridBoolColumn hinzugefügt. Legen Sie den MappingName für TaskPermitted.

Bisher haben wir alles, was wir brauchen, sehen die Checkboxen, aber keine Möglichkeit, das DataGrid mitzuteilen, ob die Checkbox angekreuzt werden sollten. Dazu müssen wir in der EhRoles' DeriveValue Ereignis Code schreiben, aber zuerst möchte ich etwas, um den Code ein wenig leichter zu schreiben hinzufügen. Ich habe eine neue ExpressionHandle-EhTasksPermittedRoles, die RootHandle war die CurrencyHandle (ChTasks) und war des Ausdrucks 'selbst. PermittedRoles'. Dadurch wäre mir leicht überprüfen, die Rollen auf den 'aktuellen'Task ausführen dürfen.

Nun zum Code schreiben, um den Wert der ehRoles.TaskPermitted berechnen. Dies geschieht in der ehRoles.DeriveValue-Veranstaltung, etwa so:

private void EhRoles_DeriveValue (Object Sender, Borland.Eco.Handles.DeriveEventArgs e)
{
Switch (e.Name) //One Ereignis für alle abgeleiteten Spalten

{
Fall 'TaskPermitted':
Erhalten Sie eine Liste der zulässigen Rollen für diese Aufgabe

IElementCollection Rollen = ehTasksPermittedRoles.Element als IElementCollection;

Vermeiden Sie eine null-Verweisausnahme

Wenn (Rollen == Null)
{
ein Element, darstellt die Konstante 'False' zurück
e.ResultElement = EcoSpace.VariableFactoryService.CreateConstant(false);
zurück;
}

Das EhTaskPermittedRoles-Element, das sagt uns zu beobachten wenn das Element
ändert, so dass wir die GUI ungültig machen
ehTasksPermittedRoles.SubscribeToElement(e.ResubscribeSubscriber);

Beachten Sie auch die Elemente in der Liste
-Rollen. SubscribeToValue(e.ValueChangeSubscriber);

Wenn die zulässigen Rollen enthält die aktuelle Rolle dann zurück
ein Element, das die Konstante 'True' darstellt

Wenn (Rollen. Contains(e.RootElement))
e.ResultElement = EcoSpace.VariableFactoryService.CreateConstant(true);
sonst
Andernfalls ein Element darstellt die Konstante 'False' zurück
e.ResultElement = EcoSpace.VariableFactoryService.CreateConstant(false);

zu brechen;

Standard:
neue Ausnahme (e.Name + 'nicht ordnungsgemäß abgeleitet');
} //switch
} //ehRoles_DeriveValue

Und schließlich brauchen wir eine Möglichkeit, dass der Benutzer zu kreuzen / deaktivieren ein Kontrollkästchens und haben der relevanten Verein hinzugefügt oder aus der Task.PermittedRoles entfernt. Dies geschieht in der ehRoles.ReverseDeriveValue-Veranstaltung, etwa so

private void EhRoles_ReverseDeriveValue (Object Sender, Borland.Eco.Handles.ReverseDeriveEventArgs e)
{
Switch(e.Name) //One Ereignis für alle abgeleiteten Spalten
{
Fall 'TaskPermitted':
Erhalten Sie eine Liste der zulässigen Rollen für die aktuelle Aufgabe
IElementCollection Rollen = (IElementCollection) ehTasksPermittedRoles.Element;

Vermeiden Sie eine null-Verweisausnahme
Wenn (Rollen == Null)
zurück;

Typumwandlung den Wert festgelegt wird, in einen booleschen Wert (von der Datagrid CheckBox)
Wenn ((booleschen) e.Value)
{
Wenn die Checkbox aktiviert wurde und die angeklickte Rolle nicht in ist der
Task.PermittedRoles-Liste hinzufügen
Wenn (! Rollen. Contains(e.RootElement))
-Rollen. Add(e.RootElement);
}
sonst
{
Wenn das Kontrollkästchen nicht aktiviert wurde und die angeklickte Rolle vorhanden in ist der
Task.PermittedRoles-Liste entfernen Sie es
Wenn (Rollen. Contains(e.RootElement))
-Rollen. Remove(e.RootElement);
}
zu brechen;
} //switch
} //ehRoles_ReverseDeriveValue

Es dauert ein wenig gewöhnungsbedürftig, aber wenn Sie lesen, dass es durch ein paar Mal Sie Jist davon bekommen kann. Dies bringt im Grunde dem Entwickler das umgekehrte abgeleitete Attribute zur Verwendung ausschließlich innerhalb der GUI. Dies bedeutet, dass wir einige clevere Dinge mit ECO II-Objekte können ohne umgekehrte abgeleitete Attribute im Modell enthalten, um GUI-Anforderungen entsprechen.

Code-abgeleiteten Spalten in Eco ii

Code-abgeleiteten Spalten in Eco ii : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Code-abgeleiteten Spalten in Eco ii
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung