Colecciones en C# - Implementación IList e IBindingList
Les comparto la implementación que hice para las interfaces IList e IBindingList.
La documentación de las interfaces se encuentra en el portal de MS; por lo que me enfocaré en los puntos en los que creo puede haber más interés.
Implementación de IList
El código está basado en la clase CollectionBase (https://referencesource.microsoft.com/#mscorlib/system/collections/collectionbase.cs,4e201fdc07f5f637) con algunas pequeñas modificaciones como por ejemplo la posibilidad de cancelar las acciones de los métodos:
- Insert
- Remove
- Clear
- Validate
Cabe aclarar que falta la implementación de los eventos de los métodos mencionados; estos métodos se encuentran como métodos virtuales con el prefijo "On" algo usual para la llamada a eventos desde esos métodos.
Ordenar por más de una propiedad
La variable dentro de la clase de la colección que contiene la lista de objetos es de tipo ArrayList la cual contiene el método Sort al cual se le puede pasar un objeto que implemente la interfaz IComparer y esta es la que usamos para lograr comparar, y por tanto poder ordenar, los objetos por más de una propiedad.
El método de la Colección para ordenar tiene el mismo nombre que el ArrayList, la diferencia se encuentra en los parámetros utilizados; el primero, es el sentido del orden y el segundo es una lista de las propiedades que se quieren utilizar para ordenar la colección:
Colección.Sort(dijSortOrder.Ascending, "Nombre", "Apellidos", "Pais")
Ordena la colección de forma ascendente considerando primero el nombre, después los apellidos y por último el país.
La implementación de la interfaz IComparer entra en un ciclo comparando los valores de cada una de las propiedades, para esto hace uso de la Reflexión, si al hacer la comparación el resultado es que los valores son iguales, hace la comparación con la siguiente propiedad y así sucesivamente hasta que o la comparación de un valor diferente de 0 (valores iguales) o que se terminen las propiedades a comparar; como que no se entiende muy bien escrito, pero en el archivo que les anexo está todo el código de esta implementación; el archivo se llama TdijObjectComparer.cs
Filtrar la colección
La implementación del filtro "formal" es algo complicado y no hay mucha información al respecto por lo que hice mi propio camino de la siguiente manera:
Hago uso de una lista adicional (List<int>) que tiene toda la lista de los indices de objetos de la colección que se pueden mostrar ver la siguiente imagen:
Cuando se usa la propiedad Count, esta regresa el número de objetos de la lista de índices (List<int>) por tal motivo, cuando la colección no está filtrada el número de objetos y de índices es el mismo y cuando está filtrada puede o no coincidir con el número de objetos.
En la propiedad Item[int index] de la colección lo que se hace es que se obtiene el indice del objeto de la lista de índices ¿? mejor con código:
object IList.this[int index]
{
get
{
TdijCollectionItem _result = null;
//Considerando el filtro
if (index >= 0 & index < innerFilteredItems.Count)
_result = (TdijCollectionItem)innerList[innerFilteredItems[index]];
return _result;
}
}
La implementación de esto se encuentra de igual manera en el proyecto anexo.
La implementación de esta interfaz tiene como objetivo poder utilizar los controles visuales que tiene el mismo Visual Estudio, la implementación de los métodos miembros de la interfaz son relativamente sencillos, a diferencia del filtrado de datos.
Utilizando el GridView se pueden mostrar los datos y con el BindingNavigator se pueden hacer operaciones sobre los datos.
Qué se puede hacer con la colección:
- Mostrar los datos en un GridView,
- Utilizar en control BindingNavigator (moverse entre los objetos, nuevo y borrar)
- Modificar los datos desde el GridView
- Cancelar las modificaciones de datos en el GridView (antes de grabar el registro, antes de cambiar de linea)
Modificación de datos y cancelación de estas en el GridView
Los objetos TdijCollectionEditableItem implementan la interfaz IEditableObject que es lo que permite conocer el estado del objeto; cuando inicia la edición los valores de las propiedades actuales son almacenadas en un Dictionary<string, object>, utilizando reflexión, si la edición de los datos es cancelada, los valores son restablecidos desde ese objeto Dictionary<,>
Saludos,
dij. ..
Archivos del proyecto.
EL SOFTWARE SE PROPORCIONA "TAL CUAL" Y EL AUTOR RECHAZA TODAS LAS
GARANTÍAS CON RESPECTO A ESTE SOFTWARE, INCLUIDAS TODAS LAS GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD Y ADECUACIÓN. EN NINGÚN CASO EL AUTOR SERÁ RESPONSABLE POR CUALQUIER DAÑO ESPECIAL, DIRECTO, INDIRECTO O CONSECUENTE, O CUALQUIER DAÑO QUE RESULTE DE LA PÉRDIDA DE USO, DATOS O BENEFICIOS, YA SEA EN UNA ACCIÓN DE CONTRATO, NEGLIGENCIA U OTRA ACCIÓN EXTRACONTRACTUAL QUE SURJA DE O EN CONEXIÓN CON EL USO O RENDIMIENTO DE ESTE SOFTWARE.
/* ----------------------------------------- */
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Comentarios
Publicar un comentario