Tip: Mostrar objetos relacionados en DevExpress GridControl
Hoy os voy a mostrar un pequeño tip, muy útil si trabajáis con este fantástico control.
En muchas ocasiones nos encontramos con la necesidad de mostrar una serie de registros de una tabla, y también queremos mostrar información de otras tablas relacionadas. En estos casos existen varias soluciones: Leer los datos de ambas tablas con una instrucción JOIN en la base de datos y mostrar la información extendida en el grid, agregar a la vista un ‘ColumnEdit’ de tipo ComboBox o LookUpEdit y cargar los datos de la tabla relacionada, interceptar el evento ‘CustomColumnDisplayText’ de la columna y mostrar los valores que deseemos, y unos cuantos más que no comentaremos aquí.
Sin embargo existe una solución mucho más sencilla (aunque no he encontrado nada de documentación al respecto). Se trata de extender la propiedad FieldName de la columna siguiendo el esquema de nuestro DataContext (LINQ to SQL) o Model (LINQ to EF).
Partiendo de la base de que disponemos de un modelo o un contexto de datos como el siguiente:
Y deseamos obtener el resultado siguiente (observar que las columnas ‘Category’ y ‘Supplier’ muestran valores de las tablas relacionadas):
Pues es tan sencillo (*) como establecer la propiedad FieldName de la columna, escribiendo el nombre del campo completo incluyendo los nombres de los objetos relacionados (en nuestro caso Category.CategoryName y Supplier.CompanyName). Nota: Es posible extender esto encadenando las clases de nuestro modelo (yo por lo menos he llegado a encadenar hasta 4 tablas).
Y lo que más me gusta de esta solución respecto a las otras es que permite incluso el filtrado de los resultados, algo que cuando hacemos interceptando el evento ‘CustomColumnDisplayText’ no es posible.
En fin, si alguien no conocía este tip y usa este control, espero que le sea útil…
Saludos desde Andorra,
L
Nota: Olvidé mencionar que esta solución es idela para aquellos formularios de consulta, no en modo de entrada de datos (entonces usaríamos un LookUpEdit).
(*) Supongo que es necesario que esté activada la carga diferida, algo que en LINQ to SQL es así de forma predeterminada, aunque no en EF.
4 Responsesso far
¿Y con el control lookupedit?
Da la misma funcionalidad de la que hablas y más flexibilidad, me parece.
Un saludo, J.
🙂
Hola ‘J’, el control LookupEdit es muy potente, pero su desventaja es que debes asignarle un origen de datos basado en la(s) otra(s) tabla(s) relacionada(s).
Si esta tabla contiene un número muy elevado de registros eso penaliza en el rendimiento. Usando la solución que propongo es mucho más rápido ya que sólo estás cargando los datos ‘estrictamente necesarios’.
Por cierto, he olvidado comentar en el post que esta solución es para formularios de consulta, no de entrada de datos (entonces no queda más remedio que usar un LookUpEdit). Voy a actualizar el post.
Un saludo!
Intento seguir tu ejemplo para eso mismo pero no me sale. ¿Puedes subir para que nos descarguemos un ejemplo?, aunque sea muy simple. superpacum@hotmail.com
Si pero neso es con DevExpress 12 qu7e pasa con la version 13 o 15