Explica lo que derivados del Código columnas son, y cómo utilizarlos.

El objetivo de este artículo será "derivados del suceso las columnas". Norden enero (Borland) me señaló en la dirección de estas cosas cuando hace poco le pregunté cómo resolver un problema GUI tuve. Cuando he utilizado en negrita para Delphi se esta realmente agradable GUI un componente llamado BoldSelectionListBox. Este componente permítanme mostrar una lista de elementos con una casilla que aparece junto a cada fila, marcando / unticking un cuadro de añadir / quitar un tema de asociación entre el elemento seleccionado y algunos otros objetos de mi elección. Eso es no la mejor explicación en el mundo, a fin de echar un vistazo en el siguiente diagrama UML:

Haga click para ampliar

Este diagrama es algo que han estado trabajando recientemente en el ECO II. Es mi interpretación de la información necesaria para crear unaInductivo interfaz de usuario. Mirando en el diagrama UML de cerca verás que cada tarea tiene cero o muchos PermittedRoles (Papel) referencias. La idea de que al especificar la función del usuario actual que puede fácilmente obtener una lista de tareas que se les permite realizar.

El uso de este BoldSelectionListBox yo sería capaz de especificar un grupo como el contexto y, a continuación, tienen una lista de todas las funciones en una especie de CheckListBox. Garrapatas que aparecen en todas las casillas donde la función está autorizada a ejecutar la acción aparece en la lista, y no cuando marque no lo es. La parte más inteligente, por supuesto, es que marcando un CheckBox en negrita que crear el vínculo necesario a objeto de vincular la función a la tarea, y añadirlo a Role.AllowedTasks (y, por supuesto, Task.PermittedRoles).

Viendo que ECO II no introduce ningún controles GUI (que en lugar ofrece. DataBinding interfaces de red de modo que usted puede utilizar los controles estándar), que sospecha que no sería capaz de lograr el mismo tipo de efecto. Enero amablemente me envió un pequeño demo mostrando la forma de lograr esto usando sólo DataGrids. Yo antes había escrito esta lógica en mi propia aplicación, y ha funcionado maravillosamente!

He añadido de expresión se ocupa de mis roles (ehRoles) y Tareas (ehTasks), vinculado a una red cada uno y añadió Añadir / Eliminar botones. Configurar cada uno de estos se ocupa de expresión para recuperar todos los casos, "Roles.allInstances" y "Tareas . allInstances ".

En el lado izquierdo de mi GUI he tenido todos los de mi enumeran las tareas, y sobre el derecho que tenía todos mis papeles. Tiene ahora quería añadir una casilla que aparece junto a cada función, de modo que pude especificar si el papel se le permitió ejecutar Actualmente, la tarea seleccionada o no. El primer problema a abordar es saber que la tarea es "seleccionado" un. Para ello he añadido un CurrencyManagerHandle llamado "chTasks", fijar su RootHandle a ehTasks, y su BindingContext a TasksDataGrid. Ahora chTasks tiene la tarea actual, agradable y fácil.Siguiente necesitaba para obtener una columna CheckBox en mi RolesDataGrid y AllowNull establecer a False. Para ello he añadido una columna falsa TaskPermitted a ehRoles y establecer su tipo en System.Boolean. Nota: El botón "Añadir" en el editor de columnas tiene un icono de menú desplegable junto a él, haga clic en y seleccione la opción que EventDerivedColumn. Luego añadió el adicionales la columna a mi RolesDataGrid, para asegurarse de que se trata de un CheckBox he elegido la lista desplegable en el botón Añadir y DataGridBoolColumn seleccionado. configurar la MappingName a TaskPermitted.Hasta el momento tenemos todo lo que necesitamos para ver las casillas de verificación, pero no hay manera de decirle a la DataGrid si la casilla de verificación debe ser marcada o no. Para ello tenemos que escribir algo de código en el ehRoles' DeriveValue caso, pero en primer lugar quiero añadir algo para hacer que el código un poco más fácil de escribir. He añadido un nuevo ExpressionHandle ehTasksPermittedRoles, el RootHandle fue el CurrencyHandle (chTasks) y la expresión fue "self.PermittedRoles". Esto me permite comprobar fácilmente que las funciones están autorizados a ejecutar la "tarea actual".

Ahora a escribir algo de código para calcular el valor de ehRoles.TaskPermitted. Esto se hace en el ehRoles.DeriveValue caso, de este modo:

private void ehRoles_DeriveValue (object sender, Borland.Eco.Handles.DeriveEventArgs e)
(
switch (e.Name) / / Un caso para todos los derivados de las columnas
(
caso "TaskPermitted":
/ / Obtener una lista de funciones permitido para esta tarea

IElementCollection = ehTasksPermittedRoles.Element funciones como IElementCollection;

/ / Evitar una referencia nula excepción

if (papeles == null)
(
/ / devolver un elemento constante que representa la "falsa"
e.ResultElement = EcoSpace.VariableFactoryService.CreateConstant (false);
retorno;
)

/ / Observe el ehTaskPermittedRoles elemento, esto nos dice cuando el elemento
/ / fin de que los cambios que pueden invalidar el GUI
ehTasksPermittedRoles.SubscribeToElement (e.ResubscribeSubscriber);

/ / También observar los elementos dentro de la lista
roles.SubscribeToValue (e.ValueChangeSubscriber);

/ / Si el papel contiene permitido el actual papel luego regresar
/ / un elemento constante que representa la "verdadera"

if (roles.Contains (e.RootElement))
e.ResultElement = EcoSpace.VariableFactoryService.CreateConstant (true);
algo más
/ / En caso contrario devolver un elemento constante que representa la "falsa"
e.ResultElement = EcoSpace.VariableFactoryService.CreateConstant (false);

break;

por defecto:
arrojar nueva excepción (e.Name + "no proceden correctamente");
) / / cambiar
) / / ehRoles_DeriveValue

Y, por último, necesitamos tener una manera de permitir al usuario marcar / untick un CheckBox y la asociación añadido o eliminado de la Task.PermittedRoles. Esto se hace en el caso ehRoles.ReverseDeriveValue, al igual que

private void ehRoles_ReverseDeriveValue (object sender, Borland.Eco.Handles.ReverseDeriveEventArgs e)
(
switch (e.Name) / / Un caso para todos los derivados de las columnas
(
caso "TaskPermitted":
/ / Obtener una lista de las funciones permitidas para la tarea actual
IElementCollection funciones = (IElementCollection) ehTasksPermittedRoles.Element;

/ / Evitar una referencia nula excepción
if (papeles == null)
retorno;

/ / Typecast el valor está ajustado a un booleano (a partir de la DataGrid CheckBox)
if ((Boolean) e.Value)
(
/ / Si en la casilla de verificación se ha comprobado, y la marcada función no se encuentra en la
/ / Task.PermittedRoles lista a continuación, añadir que
if (! roles.Contains (e.RootElement))
roles.Add (e.RootElement);
)
algo más
(
/ / Si en la casilla de verificación ha sido desactivada, y el papel existe marcada en el
/ / Task.PermittedRoles lista a continuación, retírelo
if (roles.Contains (e.RootElement))
roles.Remove (e.RootElement);
)
break;
) / / cambiar
) / / ehRoles_ReverseDeriveValue

Puede tomar un poco de acostumbrarse, pero si usted lee a través de un par de veces que usted debería ser capaz de obtener el jist de la misma. Esta, básicamente, da al desarrollador el poder de invertir los atributos derivados para uso exclusivo dentro de la GUI. Este significa que podemos hacer algunas cosas con inteligente ECOII objetos sin tener que incluir los atributos derivados de invertir en el modelo con el fin de satisfacer las necesidades GUI.

Average rating: