none
Cuando actualizo un combobox se pierde el display member RRS feed

  • Pregunta

  • Bueno tal cual dice el titulo, les muestro mi codigo:

    configurarComboBox(); //lo llamo dos veces buscando solucionar mi problema this.CBoxCiudades.DataSource = zona.ListaDeCiudades; //la vble zona guarda un list<ciudades> if (this.CBoxCiudades.DataSource != null) //ciudad tiene un campo llamado nombreCiudad { configurarComboBox();// en este metodo hago comboBox.displayMember="nombreCiudad" List<ciudad> listaCiudades = (List<ciudad>)(this.CBoxCiudades.DataSource); if (listaCiudades.Count > 0) { //si tengo ciudades en la lista

    ciudad = listaCiudades[0]; //obtengo la primera ciudad //la selecciono this.CBoxCiudades.SelectedItem = ciudad; string miembo = this.CBoxCiudades.DisplayMember; //me devuelve nombreCiudad }

    Bueno la zona tiene una lista de ciudades, cuando actualizo la zona al borrar una ciudad, vuelvo a mostrar la listad de ciudades en el combo box, pero me muestra  nombreProyecto.NameSpame.Ciudad no el nombre de la ciudad que es un de los campos de la vble ciudad.

    Alguna sugerencia o ayuda. Trate de mostrar solo lo necesario ya que el codigo es muy grande porque se llaman metodos con los botones de la interfaz, y se hace mas dificil de seguir.

    Saludos

    viernes, 3 de febrero de 2017 23:02

Respuestas

  • Hola,

    Qué raro, lo usual es que no pierda el valor de las propiedades que has configurado desde el código en tiempo de ejecución.

    El método configurarComboBox bastaría con que lo llamaras al momento que carga el formulario.

    Por ejemplo:

    public void llenarCombo()
            {
                List<Ciudades> _listaCiudades = new List<Ciudades> {
                    new Ciudades() { Id = 1, Name = "Ciudad I" },
                    new Ciudades() { Id = 2, Name = "Ciudad II"} };
    
                comboBox1.DataSource = _listaCiudades;
    
                comboBox1.DisplayMember = "Name";
    
                comboBox1.ValueMember = "Id";
            }
    private void Form1_Load(object sender, EventArgs e)
    {
          llenarCombo();
    }

    Luego podrías actualizarlo desde otro método y las propiedades deberían mantenerse.


    Antonio Mata

    • Marcado como respuesta Patriciol viernes, 14 de abril de 2017 5:23
    sábado, 4 de febrero de 2017 0:54
  • Hola , bueno mucho tiempo despues me di cuenta de mi error, y no pasaba por la configuracion del combo sino porque a veces trataba de cargar en el combo box una lista cuya cantidad de elementos era cero; entonces cuando me tenia que mostrar el displayMember me mostraba el tipo de lo que me deberia mostrar. 

    Gracias por la colaboracion.

    • Marcado como respuesta Patriciol viernes, 14 de abril de 2017 5:22
    • Desmarcado como respuesta Patriciol viernes, 14 de abril de 2017 5:22
    • Marcado como respuesta Joyce_ACModerator viernes, 14 de abril de 2017 14:53
    viernes, 14 de abril de 2017 5:22

Todas las respuestas

  • Hola,

    Qué raro, lo usual es que no pierda el valor de las propiedades que has configurado desde el código en tiempo de ejecución.

    El método configurarComboBox bastaría con que lo llamaras al momento que carga el formulario.

    Por ejemplo:

    public void llenarCombo()
            {
                List<Ciudades> _listaCiudades = new List<Ciudades> {
                    new Ciudades() { Id = 1, Name = "Ciudad I" },
                    new Ciudades() { Id = 2, Name = "Ciudad II"} };
    
                comboBox1.DataSource = _listaCiudades;
    
                comboBox1.DisplayMember = "Name";
    
                comboBox1.ValueMember = "Id";
            }
    private void Form1_Load(object sender, EventArgs e)
    {
          llenarCombo();
    }

    Luego podrías actualizarlo desde otro método y las propiedades deberían mantenerse.


    Antonio Mata

    • Marcado como respuesta Patriciol viernes, 14 de abril de 2017 5:23
    sábado, 4 de febrero de 2017 0:54
  • Hola grcaias por responder. Si configuro el combo cuando construyo el formulario, pero el displayMember se perdia entones empece a llamar el metodo desde otros lados.
    public formZonas(usuario usuario)
            {
    
                InitializeComponent();
                usuarioActual = usuario;
                conn = new DAOSConexion();
                configurarDataGridZonas();
                configurarDGVCiudades();
                configurarComboBox();//aca configuro el combo pero el display se perdia
                try
                {
                    conn.Abrir();
                    dGVZonas.DataSource = zonaDao.obtenerZonas(conn);
                    dGVCiudades.DataSource = ciudadDao.obtenerCiudades(conn);
                    conn.Cerrar();
                }
                catch (Exception e)
                {
                    string m = e.Message;
                    conn.RollBack();
                }
    
            }

    sábado, 4 de febrero de 2017 2:15
  • Hola,en que evento programas el código mostrado anteriormente.

    solo había visto utilizar el displaymember para asignarle un valor , pero no para rescatar el texto del combobox para eso existen las propiedades  SelectedText y Text 

    Para asignarle un valor de selección al combo podrías asignar el selectedvalue, claro que esto generará que evento SelectedIndexChanged se disparé si lo tienes programado

                this.CBoxCiudades.DataSource = zona.ListaDeCiudades; //la vble zona guarda un list<ciudades>
                if (this.CBoxCiudades.DataSource != null)          //ciudad tiene un campo llamado nombreCiudad
                {         
                    List<ciudad> listaCiudades = (List<ciudad>)(this.CBoxCiudades.DataSource);
                    if (listaCiudades.Count > 0)
                    {   
                        ciudad = listaCiudades[0];
                        this.CBoxCiudades.SelectedValue = ciudad.IdCiudad;//aqui se lanzará el evento SelectedIndexChanged
    		    string miembro = this.CBoxCiudades.Text; 
                     }
    	    }
    Quedo a la espera de tus comentarios.



    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.




    • Editado Augusto1982 sábado, 4 de febrero de 2017 18:18
    sábado, 4 de febrero de 2017 18:17
  • Hola Augusto. Te cuento como viene el programa, es medio largo y se puede prestar a confusiones para interpretar pero voy a tratar de ser lo mas claro posible. Yo tengo un datagridV con una lista de zonas. Cada vez que selecciono una zona en el datagrid (haciendo click en una fila del datagrid), hay un combobox que se carga con la lista de ciudades que tiene la variable zona. Ciudad es una clase y uno de sus campos es nombreCiudad. El codigo que estas viendo esta programado en el evento datagridview.cell_click. 

    configurarComboBox(); //lo llamo dos veces buscando solucionar mi problema this.CBoxCiudades.DataSource = zona.ListaDeCiudades; //la vble zona guarda un list<ciudades> if (this.CBoxCiudades.DataSource != null) //ciudad tiene un campo llamado nombreCiudad { configurarComboBox();// en este metodo hago comboBox.displayMember="nombreCiudad" List<ciudad> listaCiudades = (List<ciudad>)(this.CBoxCiudades.DataSource); if (listaCiudades.Count > 0) { //si tengo ciudades en la lista ciudad = listaCiudades[0]; //obtengo la primera ciudad //el codigo de abajo lo escribo porque cuando asigno al combo la lista de ciudades que //tiene la zona, el combo queda cargado pero me muestra la primera fila del combo vacia

    //y por preferencia mia cargo la primera fila del combon con la primera ciudad de la lista

    this.CBoxCiudades.SelectedItem = ciudad;//tengo programado el evento SelectionChangeCommitted string miembo = this.CBoxCiudades.DisplayMember; //este codigo solo lo tengo para

    //asegurarme que la configuracion del combo no se pierde (que ese es mi problema)

    //lo use solo para poner puntos de inturrepcion y fijarme controlar eso pero

    //cuando tenga el proyecto listo la borrare }


    Gracias por tus sugerencias.


    • Editado Patriciol lunes, 6 de febrero de 2017 2:13
    lunes, 6 de febrero de 2017 2:06
  • Hola, por lo que veo tu ncesitas rescargar el combobox y en efecto debes de volver a configurarlo,

            private void llenarZonas()
            {
                List<Zonas> lista = new List<Zonas>();
                Zonas entZona1 = new Zonas();
                entZona1.idZona = 1;
                entZona1.Zona = "Zona 1";
                lista.Add(entZona1);
    
                Zonas entZona2 = new Zonas();
                entZona2.idZona = 2;
                entZona2.Zona = "Zona 2";
                lista.Add(entZona2);
    
                dgvZonas.DataSource = lista;
            }
    
            private void llenarCiudades(Int32 zona)
            {
                List<Ciudades> lista = new List<Ciudades>();
                Ciudades entCiudad1 = new Ciudades();
                entCiudad1.idZona = 1;
                entCiudad1.idCiudad =1;
                entCiudad1.Ciudad = "ciudad 1";
                lista.Add(entCiudad1);
    
                Ciudades entCiudad2 = new Ciudades();
                entCiudad2.idZona = 2;
                entCiudad2.idCiudad = 2;
                entCiudad2.Ciudad = "ciudad 2";
                lista.Add(entCiudad2);
    
                cboCiudades.ValueMember = "id";
                cboCiudades.DisplayMember = "Ciudad";
               
                cboCiudades.DataSource =  lista
                .Where(pr => lista
                             .Any(p => pr.idZona == zona)).ToList();
    
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                llenarZonas();
            }
    
            private void dgvZonas_CellClick(object sender, DataGridViewCellEventArgs e)
            {
                llenarCiudades(Convert.ToInt32(dgvZonas.Rows[e.RowIndex].Cells[0].Value.ToString()));
            }
        }
    
        public class Zonas
        {
             public int idZona { get; set; }
             public string Zona { get; set; }
        }
    
        public class Ciudades
        {
            public int idZona { get; set; }
            public int idCiudad { get; set; }
            public string Ciudad { get; set; }
        }


    Si la respuesta te fue útil vótala como tal,y si fue respuesta márcala. Solo dejo en el foro mis post si fueron útiles , de lo contrario y por mantener el orden los borro. Saludos. Lima-Perú.

    lunes, 6 de febrero de 2017 3:44
  • Patriciol,

    No veo porque complicarse tanto, por cada vez que la selección de una fila cambie es necesario volver a cargar el origen de datos filtrando por la zona seleccionada actualmente:

    private void dGVZonas_SelectionChanged(object sender, EventArgs e)
    {
    	DataGridViewRow fila = ((DataGridView)sender).CurrentRow;
    
    	if (fila != null)
    	{
    		CBoxCiudades.DataSource = null;
    
    		CBoxCiudades.DataSource = zona.ListaDeCiudades
    			.FirstOrDefault(x => x.idZona == fila.Cells["ColZona"].ToString());
    		CBoxCiudades.ValueMember = "idCiudad";
    		CBoxCiudades.DisplayMember = "nombreCiudad";
    	}
    }

    Es de esperar que la entidad Ciudad tenga una propiedad que defina la asociación con la entidad Zona, mediante esa propiedad podemos escribir la expresión de filtro para restringir las ciudades para la zona seleccionada.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    lunes, 6 de febrero de 2017 5:47
  • hola

    >>configurarComboBox(); //lo llamo dos veces buscando solucionar mi problema

    cual es el codigo que defines en configurarComboBox() ? porque alli parece haber algo oculto que no deberias tener

    solo deberias asegurarte que el DisplayMember del combo tiene asignado una propiedad de la clase "ciudades" que asignas en la lista  List<ciudades>

    ----

    Ademas no debes llamar dos veces a configurarComboBox() uno antes de asignar el DataSource y el otro dentro del   if (this.CBoxCiudades.DataSource != null)

    el combo solo se configura una unica vez y nada mas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 6 de febrero de 2017 10:10
  • Hola . Gracias por tu respuesta. Recien ahora pude retomar el trabajo sobre esto. 

    Me he asegurado que el displayMember tiene tiene asignado una propiedad de la clase ciudades. Y aun asi no funciona.

    Gracias.

    lunes, 20 de febrero de 2017 0:37
  • Hola. Recien pude retomar este proyecto.Gracias por tu respuesta. Sincermente no entiendo completamente tu codigo. Debere estudiar mas.

    Saludos.

    lunes, 20 de febrero de 2017 0:38
  • Hola. Recien pude retomar este proyecto.Gracias por tu respuesta. Sincermente no entiendo completamente tu codigo. Debere estudiar mas.

    Saludos.

    ¿Obtienes alguna excepción?

    ¿Podrías comentarnos que llevas hecho y que resultados estás obteniendo?

    lunes, 20 de febrero de 2017 2:12
  • Hola , bueno mucho tiempo despues me di cuenta de mi error, y no pasaba por la configuracion del combo sino porque a veces trataba de cargar en el combo box una lista cuya cantidad de elementos era cero; entonces cuando me tenia que mostrar el displayMember me mostraba el tipo de lo que me deberia mostrar. 

    Gracias por la colaboracion.

    • Marcado como respuesta Patriciol viernes, 14 de abril de 2017 5:22
    • Desmarcado como respuesta Patriciol viernes, 14 de abril de 2017 5:22
    • Marcado como respuesta Joyce_ACModerator viernes, 14 de abril de 2017 14:53
    viernes, 14 de abril de 2017 5:22