none
Error Combobox: System.Data.Entity.DynamicProxies RRS feed

  • Pregunta

  • hola a todos, estoy haciendo un sistema para veterinaria y estoy en la parte de Reportes, utilizando Crystal Reports. mi formulario es el siguiente: 

    A la hora de cargar el combo del Cliente realizo lo siguiente:

            private void cargarComboCliente()
            {
                clsCliente objClsCliente = new clsCliente();
                objClsCliente.cargarComboCliente(cmbCliente);
            }
    
            public class ClienteV
            {
                public int IDCliente { get; set; }
                public string NombreCompleto { get; set; }
            }
    
            public void cargarComboCliente(ComboBox cmbCliente)
            {
                using (BDVeterinariaEntities BD = new BDVeterinariaEntities())
                {
                    cmbCliente.DisplayMember = "NombreCompleto";
                    cmbCliente.ValueMember = "IDCliente";
    
                    IQueryable <ClienteV> iqCliente = from x in BD.Cliente
                                                      select new ClienteV
                                                      {
                                                          IDCliente = x.IDCliente,
                                                          NombreCompleto = x.Nombre + " " + x.Apellido
                                                      };
    
                    List<ClienteV> lstClienteV = new List<ClienteV>();
                    lstClienteV.Add(new ClienteV { IDCliente = 0, NombreCompleto = "Todos" });
                    lstClienteV.AddRange(iqCliente.ToList());
                    cmbCliente.DataSource = lstClienteV;
                    cmbCliente.SelectedIndex = 0;
                }
            }

    Lo que hago es crear un objeto virtual en el que solamente traigo el ID y Nombre completo (únicos datos que necesito).

    Una vez que se carga el combo del Cliente, en base a la selección de uno de ellos, cargo el combo de Mascotas, mostrando la/las mascota/s del mismo:

            private void cmbCliente_SelectedIndexChanged(object sender, EventArgs e)
            {
                clsCliente.ClienteV objClienteV = (clsCliente.ClienteV)((ComboBox)sender).SelectedItem;
    
                clsMascota objClsMascota = new clsMascota();
                cmbMascota.DataSource = objClsMascota.SelectMascota("", 0, objClienteV.IDCliente);
            }
            public List<Mascota> SelectMascota(string stNombreMascota, int IDTipoMascota, int IDCliente)
            {
                List<Mascota> lstMascota = new List<Mascota>();
                using (BDVeterinariaEntities BD = new BDVeterinariaEntities())
                {
                    if (stNombreMascota == "" && IDTipoMascota == 0 && IDCliente != 0)
                    {
                        lstMascota = BD.Mascota.Include("TipoMascota").Include("Cliente").Include("Raza").Where(x => x.IDCliente == IDCliente).ToList();
                    }            
                    return lstMascota;
                }
            }


    Pero como resultado obtengo esto:

    Cuando esta la opcion "Todos" me trae la cantidad de mascotas, cuando selecciono un cliente en especial me trae la cantidad que tiene ese cliente, pero siempre mostrando el error.. Agradezco su ayuda de antemano! saludos


    • Editado AguFortini jueves, 2 de noviembre de 2017 19:32
    jueves, 2 de noviembre de 2017 19:23

Respuestas

  • Básicamente lo que ocurre es que en el DataSource del cmbMascota estás metiendo objetos de la clase Mascota, y no has indicado en el DisplayMember cuál de las propiedades de esa clase quieres mostrar. Cuando haces esto, lo que hace el combo es llamar al método .ToString() del objeto que le has metido, y para los objetos que no tienen un override del ToString, eso implica llamar al ToString de System.Object, el cual lo que hace es escribir el nombre de la clase... y ese nombre es el que estás viendo en el combo.

    Hay varias soluciones: una es asignar al combo una lista de Strings obtenidos desde la lista de mascotas:

    cmbMascota.DataSource = objClsMascota.SelectMascota("", 0, objClienteV.IDCliente).Select(x=>x.Nombre);

    Otra es meter un override de ToString dentro de la clase Mascota (puedes usar para ello un partial class si Mascota es autogenerada por Entity Framework), y hacer que ese ToString devuelva el campo que quieras mostrar en el combo.

    Y otra es asignarle al combo el DisplayMember, igual que lo haces para el combo de clientes.



    jueves, 2 de noviembre de 2017 20:40
    Moderador