none
MOSTRAR ATRIBUTO DE OBJETO EN GRIDVIEW RRS feed

  • Pregunta

  • BUenas, bueno quiero mostrar en un gridvoew una coleccion de objeto PERSONA.

    PERSONA esta compuesto por atributos Cedula,Nombre,apellido,Direccion y un objeto VEHICULO(tiene como atributo matricula aparte de otros),LOS DATOS QUE YO QUIERO MOSTRAR SON: CEDULA,NOMBRE,MATRICULA cuando listo en el gridview, voy a editar columnas, agrego un bounfield , y en el campo datafield le pongo el nombre del atributo, con la cedula y el nombre nmo tengo problemas pero no logro mostrar la matricula del VEHICULO.

    EJEMPLO

    boundfield: Nombre, datafield:Nombre

    boundfield: Cedula, datafield:Cedula

    boundfield:Matricula, datafield: ??????

    DESDE YA GRACIAS 


    • Editado invasor820 miércoles, 22 de febrero de 2012 11:14
    miércoles, 22 de febrero de 2012 11:13

Respuestas

  • HOLA, E SOLUCIONADO FACILMENTE, EN LA CLASE PERSONA, CREE UNA PROPIEDAD QUE ME RETORNA LA MATRICULA DEL VEHICULO Y EN EL DATAFIELD PUSE ESA PROPIEDAD.

    public class Persona{

        public string Cedula {get; set;}

        public string Nombre {get; set;}

        public Vehiculo Vehiculo{get; set;}

        public string Matricula {get {return Vehiculo.Matricula}}


    }

    SALUDOS

    • Propuesto como respuesta invasor8201 miércoles, 22 de febrero de 2012 16:06
    • Marcado como respuesta invasor820 miércoles, 22 de febrero de 2012 16:07
    miércoles, 22 de febrero de 2012 16:03

Todas las respuestas

  • Hola @invasor820:

    Lo que se hace en estos casos es crear un dto o lo que es lo mismo un objeto plano y es a ese al que se enlaza. En vez de tener un objeto persona que contien un objeto vehiculo, crea un objeto de la siguiente forma y es est el que utilizas para enlazar a datos.

    public class PersonaDto
    {
       public string Nombre {get;set;}
       public string Cedula {get;set:}
       public string Matricula {get;set;}
       
    }

    Saludos,


    phurtado


    miércoles, 22 de febrero de 2012 11:25
    Moderador
  • hola

    el gridview si permite visualizar colecciones complejas

    para este caso podrias usar

    boundfield:Matricula, datafield: Vehiculo.Matricula

    eso si debes tener una entidad que sea

    public class Persona{

        public string Cedula {get; set;}

        public string Nombre {get; set;}

        public Vehiculo Vehiculo{get; set;}

    }

    public class Vehiculo{

       public string Matricula {get; set;}

    }

    como veras las entidades tienen que tener una conexion, si lo defienes con Vehiculo.Matricula en la columna del gridview deberia poder verlo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    miércoles, 22 de febrero de 2012 11:43
  • Leandro, pongo eso y no me anda, me dice: no se encontro ningun campo o  propiedad.

    Saluds

    miércoles, 22 de febrero de 2012 11:51
  • pero defines las clases como puse el ejemplo ?

    recuerda que deben estar relacionadas, validad que las hayas escrito correctamente, recuerda que c# es keysesitive, repeta mayusculas y minusculas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 22 de febrero de 2012 11:54
  • Hola

    Mira estos link que parece aportar una solución

    http://weblogs.asp.net/lancea/archive/2004/08/04/207770.aspx 

    http://stackoverflow.com/questions/8881028/how-to-bind-the-grid-view-to-complex-object 

    De todas formas sigo pensando lo mismo, no entiendo como no definimos nuestros objetos de enlace a datos como objetos simples, parece ser que nos da miedo definir clases, cuando a la postre se solucionan todo este tipo de problemas.

    Con esto lo que te quiero decir es que estás ligando tus clases a una tecnología en concreto, ya se que me puedes decir que no vas a utilizar Windows Forms por ejemplo, pero si lo hicieses eso no te serviría.

    Define una clase con atributos simples y te olvidas el resto de tu vida.

    Saludos,


    phurtado

    miércoles, 22 de febrero de 2012 12:03
    Moderador
  • lo mismo, no entiendo como no definimos nuestros objetos de enlace a datos como objetos simples, parece ser que nos da miedo definir clases,

    simplemente porque tecnologia como los ORM nos brindan lazy load para crear estructuras complejas, facilmente persistibles a datos

    sino tienes un WCF en medio para transportar estas estructuras, lo mas comun es que quieras usarlas tal cual el modelo del ORM las genero

    digo para que mapear y desmapear estructuras si la idea es programar facil y rapido

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 22 de febrero de 2012 12:08
  • Hola Leandro,

    Que tengas un orm o que tu capa de servicios transmita estructuras complejas no implica que mapees dto's que por lo menos sabes que sea la tecnología que sea no te va a dar problemas.

    Te pongo un ejemplo piensa en una factura con 50 o sesenta campos y logicamente una relación con el cliente con otros tantos, me estás diciendo que ese es el objeto con el que tengo que trabajar para mostrar en una lista con los siguientes campos.

    Numero de Factura,Fecha,Cliente,Importe.

    Pues menuda solución la del Lazy Load, rapido puede ser  pero la verdad es que tu y yo sabemos que menos eficiente puede ser cualquier cosa.

    Sigo en mis trece y es no leas de una bb.dd más que lo que necesitas mostrar al usuario. Ahora como bien sabes cada uno es libre lógicamente de hacer lo que quiera:)

    Saludos,


    phurtado

    miércoles, 22 de febrero de 2012 12:17
    Moderador
  • Te pongo un ejemplo piensa en una factura con 50 o sesenta campos y logicamente una relación con el cliente con otros tantos, me estás diciendo que ese es el objeto con el que tengo que trabajar para mostrar en una lista con los siguientes campos.

    sino hay un WCF que implique una comunicacion remota y por ende un punto que implica transporte  a tener en cuenta

    que problema hay en traer de la db 50 campos de una factura, no lo veo nada mas si la db esta en el mismo web server

    si tengo 20 pantallas en donde muestro en una 3 campos de factura en otra 10 de estos campos, en otro 5 distintos y asi continua, queires decir que vas a crear y transformar la entidad factura en 20 copias distintas porque 20 pantallas asi lo requieren ? digo como que me voy a matar programando entidades por todos lados y mapear tordas estas con una unica de 50 propiedades

    como que se van a disparar los tiempos de desarrollo, digo me parece

    vuelvo a mencionar si hay un WCF en medio es una cosa, sino lo esta es otra distinta, si esta todo local 50 campos no es nada recuperarlo de la db y cargar una entidad, por ams que luego se usen 3 de estos

    porque ahora usas 3 pero en 20 pantallas distintas vaya a saber uno cuales usaras

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    miércoles, 22 de febrero de 2012 12:27
  • Hola Leandro,

    Yo siempre lo he hecho así si necesito 20 defino 20 dto's lo que no hago es leer no 50 como apuntas sino 100 que el cliente tambien suma. 

    Se disparan los tiempos de desarollo pues no se evidentemente cuesta más definir 20 clases que definir una, pero se que lo que defino tiene una performance aceptable de la otra forma pues te puedes llevar sorpresar por ir tan rapido:)

    De todas formas es dificil mostrar 20 pantallas diferentes sobre una misma entidad y sabes perfectamente que con una o dos que engloblen ciertos datos has soluionado el problema, pero no una que lleve todo.

    Mira te lo voy a decir donde si me gustan los DaTatables en estas situaciones y es así como se deberían de comportar los anonymous types de hecho se que en Windows Forms si conviertes a tu ToList() 3 campos de los 100 puedes utilizar binding sin problemas. No lo he probado en Asp.Net y si tengo claro que no funcionan en ASP.NET MVC si utilizas vistas tipadas en la vista excepto que trabajes con ViewBag o lo que es lo mismo un tipo dinamyc.

    Te pongo un ejemplo piensa una web que la trabajas con Ajax, tu que harías logicamente devolver mediante Json el menor numero de campos posibles o es más los que realmente se vean.

    Fijate hemos tocado tres tecnologías asp.net,asp.net mvc y las misma con ajax y como ves cada una se debe de pensar de formas diferentes simplemente por no tener un bindig dinamico o poder enlazar estos a objetos Anonimos.

    Mi opinion es que creo que se debería de unificar este tipo de cosas y que de una vez por todas seamos capaces de no estar tan ligados a las vistas para poder diseñar nuestra aplicación, es por eso por lo que propongo no una sino las que hagan falta.


      List<Persona> Lista = new List<Persona>()
                {
                    new Persona(){sNombre = "Persona",sApellidoMaterno = "Apellido Paterno",sApellidoPaterno = "Apellido Paterno"}
                };


                dynamic resultado = from item in Lista
                                select new { Nombre = item.sNombre, Apellidos = string.Format("{0} {1}", item.sApellidoPaterno, item.sApellidoMaterno) };


                foreach (var item in resultado)
                {
                    string Nombre = item.Nombre;
                }

    A que si las vistas pudiesen resolver estas cosas ya no sería tan tedioso?. Leo lo que quiero y lo paso entre capas sin problemas, eso si que ahorraría trabajo.

    Saludos,


    phurtado

    miércoles, 22 de febrero de 2012 13:07
    Moderador
  • Te pongo un ejemplo piensa una web que la trabajas con Ajax, tu que harías logicamente devolver mediante Json el menor numero de campos posibles o es más los que realmente se vean.

    si pero en ajax usaria linq para crear una clase anonima que aplane la entidad y despues

    Json.NET para para serializar esa clase en json y enviarla como string (como retorno de un webmethod) o sea aplano sin necesidad de crear clase dto intermedia alguna

    pero una clase anomina no puedes devolver como resultado de un metodo que uses directamente

    Mi opinion es que creo que se debería de unificar este tipo de cosas y que de una vez por todas seamos capaces de no estar tan ligados a las vistas para poder diseñar nuestra aplicación, es por eso por lo que propongo no una sino las que hagan falta.

    pero usas lo que hace falta, solo que no te poner a mapear y desmapear sino hace falta al estar local

    igualmente alli estas usando un truco que no siempre dispones, apunto a ese "dynamic", no siempre puedes usarlo, porque no todos pueden implementar .net 4

    cuando pongas codigo aplica algo asm generico que no vaya mas alla de .net 3.5 que es lo regularmente estandar que se puede encontrar

    ojo igual una aclaracion, no apunto a no hacer lo que comentas, es mas yo tambien lo realizo en muchas oportunidades, pero lo hago donde america hacerlo, no es que sistematicamente todo lo transformo, a ese punto es donde remarco

    como comente quizas un entorno WCF se propocia mas a realizar esto de forma natural, en otro ambiente en donde la conexiona  al entidad es directa, se tiende a no realizarla, salvo se detecte algun problema de performance

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    miércoles, 22 de febrero de 2012 13:17
  • Hola Leandro,

    pero una clase anomina no puedes devolver como resultado de un metodo que uses directamente 

    Efectivamente y así es, aunque para estos casos una verdadera pena. Ahora no lo he probado con el GridView, pero con el DataGridView de Windows Forms si tu devuelves en el metodo un List<Object> haces binding perfectamente.

    Si lo que realmente quiero transmitir es que por culpa de la vista estamos condicionando nuestra arquitectura cuando no debería ser así. Por eso propongo crear dto's que es lo que se que se comen todas :).

    Problemas de Performance.

    Fijate en un ejemplo, imagina que la factura tiene un campo Varbinary(Max) donde guardo una imagen de la factura, si hacemos lo que propones y me da lo mismo el entorno, cuando pagine 20 facturas si no hago la burrada de no paginar imagina lo que estás haciendo y como esos se pueden dar mil ejemplos.

    La verdad que no hay un todo con lo cual como bien apuntas cada cosa es un tema, pero insisto en lo que me condicionan las vistas y los mecanismos de binding a estas cosas.

    Saludos


    phurtado

    miércoles, 22 de febrero de 2012 13:59
    Moderador
  • HOLA, E SOLUCIONADO FACILMENTE, EN LA CLASE PERSONA, CREE UNA PROPIEDAD QUE ME RETORNA LA MATRICULA DEL VEHICULO Y EN EL DATAFIELD PUSE ESA PROPIEDAD.

    public class Persona{

        public string Cedula {get; set;}

        public string Nombre {get; set;}

        public Vehiculo Vehiculo{get; set;}

        public string Matricula {get {return Vehiculo.Matricula}}


    }

    SALUDOS

    • Propuesto como respuesta invasor8201 miércoles, 22 de febrero de 2012 16:06
    • Marcado como respuesta invasor820 miércoles, 22 de febrero de 2012 16:07
    miércoles, 22 de febrero de 2012 16:03