none
mostrar datos de un combobox RRS feed

  • Pregunta

  • Amigos buenas tardes aqui solicitando su ayuda nuevamente.

    Estoy trabajando con una aplicacion en windos forms y tengo varios combobox o dropdownlist para mostrar datos de unas tablas en sql server, para poder llamarlos diseñe unos stored procedures de consulta que al ejecutarlos me muestran correctamente los datos.

    El problema es que cuando ejecuto el formulario no me muestra nada los combos les muestro mi codigo:

    este evento debe mostrar una lista de cinco preguntas de una tabla

             private void comboBox4_SelectedIndexChanged(object sender, EventArgs e)
            {
                Datos dat = new Datos();
                comboBox4.ValueMember = "num_preguntas";
                comboBox4.DisplayMember = "num_preguntas";
                comboBox4.DataSource = dat.SeleccionarRespuestas();
            }

    pero no pinta los datos me podrian decir por favor a que se debe se los agradecere mucho.

    Saludos !

    martes, 26 de julio de 2016 1:15

Todas las respuestas

  • Hola ARMANDO DAZA,

    Prueba poniendo un punto de interrupción, y verifica que es lo que retorna el dat.SeleccionarRespuestas(), si llega con data o no.

    Deberías usar el evento SelectionChangeCommitted de tu ComboBox en vez del SelectedIndexChanged.

    Muestra tu código como estás haciendo la consulta a la BD.

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    martes, 26 de julio de 2016 1:50
  • Hola Joel.

    Muchas gracias por responderme, mira éste es mi código en la capa de datos:

    class Datos
        {
            string strConnString;

            public Datos()
            {
                this.strConnString = System.Configuration.ConfigurationSettings.AppSettings["calificaciones"].ToString();
            }

            public bool GrabarExamen(int id_examen, string materia)
            {
                SqlConnection conexion = new SqlConnection();
                conexion.ConnectionString = this.strConnString;
                conexion.Open();

                SqlCommand comando = new SqlCommand();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "g_examen";
                comando.Connection = conexion;

                SqlParameter parametro1 = new SqlParameter("@id_examen", SqlDbType.Int, 2);
                parametro1.Value = id_examen;
                comando.Parameters.Add(parametro1);

                SqlParameter parametro2 = new SqlParameter("@materia", SqlDbType.VarChar, 40);
                parametro2.Value = materia;
                comando.Parameters.Add(parametro2);

                int resultado = comando.ExecuteNonQuery();

                conexion.Close();

                return true;
            }

            public bool InsertarMateria(string nommateria)
            {
                SqlConnection conexion = new SqlConnection();
                conexion.ConnectionString = this.strConnString;
                conexion.Open();

                SqlCommand comando = new SqlCommand();
                comando.CommandType = CommandType.StoredProcedure;
                comando.CommandText = "i_materia";
                comando.Connection = conexion;

                SqlParameter parametro1 = new SqlParameter("@nommateria", SqlDbType.VarChar, 40);
                parametro1.Value = nommateria;
                comando.Parameters.Add(parametro1);

                int resultado = comando.ExecuteNonQuery();

                conexion.Close();

                return true;
            }

            public DataTable OportunidadExamen(int vuelta, DateTime fecha)
            {
                SqlConnection conexion = new SqlConnection(this.strConnString);
                DataTable resultado = new DataTable();
                try
                {
                    conexion.Open();

                    SqlCommand comando = new SqlCommand();
                    comando.CommandType = CommandType.StoredProcedure;
                    comando.CommandText = "o_examen";
                    comando.Connection = conexion;

                    SqlParameter parametro1 = new SqlParameter("@vuelta", SqlDbType.Int, 2);
                    parametro1.Value = vuelta;
                    comando.Parameters.Add(parametro1);


                    SqlDataReader reader = comando.ExecuteReader();
                    resultado.Load(reader);
                }
                catch (Exception ex)
                {
                    return null;
                }
                finally
                {
                    conexion.Close();
                }

                return resultado;
            }

            public DataTable SeleccionarRespuestas()
            {
                SqlConnection conexion = new SqlConnection(this.strConnString);
                DataTable resultado = new DataTable();
                try
                {
                    conexion.Open();

                    SqlCommand comando = new SqlCommand();
                    comando.CommandType = CommandType.StoredProcedure;
                    comando.CommandText = "s_respuestas";
                    comando.Connection = conexion;

                    SqlDataReader reader = comando.ExecuteReader();
                    resultado.Load(reader);
                }
                catch (Exception ex)
                {
                    return null;
                }
                finally
                {
                    conexion.Close();
                }

                return resultado;
            }

        }

    y en el codebehind lo tengo de esta manera:

     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                Datos dat = new Datos();
                comboBox1.ValueMember = "id_examen";
                comboBox1.DisplayMember = "id_examen";
                //comboBox1.ValueMember = "materia";
                //comboBox1.DisplayMember = "materia";
                //comboBox1.DataSource = dat.GrabarExamen("id_examen", "materia");
                
            }

            private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
            {
                Datos dat = new Datos();
                //dat.OportunidadExamen();
            }

            // no tiene parametros
            private void comboBox4_SelectedIndexChanged(object sender, EventArgs e)
            {
                Datos dat = new Datos();
                comboBox4.ValueMember = "num_preguntas";
                comboBox4.DisplayMember = "num_preguntas";
                comboBox4.DataSource = dat.SeleccionarRespuestas();
            }

            protected void cargarexamenes()
            {
                //comboBox1
            }

            private void Form1_Load(object sender, EventArgs e)
            {
             //comboBox1.SelectedIndex = 0;
            }
        }

    Dónde está el error de favor me podrías hacer las observaciones ?

    Muchas gracias de antemano

    Saludos !

    martes, 26 de julio de 2016 2:23
  • ARMANDO DAZA,

    El evento SelectedIndexChanged se desencadena cuando la propiedad SelectedIndex cambia (cuando un nuevo elemento ha sido seleccionado), sin embargo -según muestras- el objeto comboBox4 no tiene datos previamente cargados, por tanto el evento nunca va a ejecutarse (no existen elementos por seleccionar). 

    Seguramente habrás deducido que no debes cargar los datos del desplegable en dicho evento, la acción debes efectuarla una vez el formulario haya sido cargado (evento Load).

    private void Form1_Load(object sender, EventArgs e)
    {
            Datos dat = New Datos();
            comboBox4.ValueMember = "num_preguntas";
            comboBox4.DisplayMember = "num_preguntas";
            comboBox4.DataSource = dat.SeleccionarRespuestas();
    
            /*Realizar carga de los demás objetos*/
    }


    Nota que la carga de datos al objeto de tipo ComboBox se realiza cuando el formulario ha sido cargado. 


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

    martes, 26 de julio de 2016 2:37
  • Hola de nuevo Williams.

    Mira te comento que lo intenté asi como me lo recomendaste pero me sigue sin pintar los datos.

    yo intente meter todo de esta manera y tampoco me funciona.

           private void Form1_Load(object sender, EventArgs e)
            {
                MostrarRespuestas();
            
            }

            public void MostrarRespuestas()
            {
                Datos dat = new Datos();
                comboBox4.ValueMember = "num_preguntas";
                comboBox4.DisplayMember = "num_preguntas";
                comboBox4.DataSource = dat.SeleccionarRespuestas();
            }

    que podriamos hacer ? gracias nuevamente.

    martes, 26 de julio de 2016 3:09
  • ARMANDO DAZA,

    A simple vista el método SeleccionarRespuesta() aparenta no tener problemas, sin embargo hay unas líneas que no veo bien:

    catch (Exception ex)
    {
          return null;
    }


    ¿Qué sentido tiene implementar un controlador de errores si en caso ocurra una excepción "lo escondes bajo la alfombra"? Si haces uso de un controlador de errores try...catch es para realizar acciones sobre la excepción como mostrar un mensaje con el error o logearlo:

    catch (Exception ex)
    {
          MessageBox.Show(ex.Message);
    }

    Es posible que el controlador esté derivando el flujo al bloque catch pero tu "hábilmente" evitas que el sistema te advierta en caso algo ocurra, espero lo consideres y realices las correctivas.

    Sí tras hacer los cambios sugeridos no obtienes ningún error entonces te pido validar dos cosas:

    1. ¿El objeto de tipo DataTable contiene filas para mostrar?
    2. ¿La columna [num_preguntas] existe como parte de la lista que retorna el procedimiento almacenado s_respuestas?

    Quedo atento a tus comentarios.

    martes, 26 de julio de 2016 3:31
  • Hola

    Mira te comento que lo intenté asi como me lo recomendaste pero me sigue sin pintar los datos.
    
    yo intente meter todo de esta manera y tampoco me funciona.
    
           private void Form1_Load(object sender, EventArgs e)
            {
                MostrarRespuestas();
             
            }
    
            public void MostrarRespuestas()
            {
                Datos dat = new Datos();
                comboBox4.ValueMember = "num_preguntas";
                comboBox4.DisplayMember = "num_preguntas";
                comboBox4.DataSource = dat.SeleccionarRespuestas();
            }
    
    que podriamos hacer ? gracias nuevamente.


    Estas asignando mal la propiedades debería ser ....

    comboBox4.DataSource = dat.SeleccionarRespuestas();
    comboBox4.ValueMember = "Id"; ==> Código
    comboBox4.DisplayMember = "Descripcion"; ==> Valor
     

    Una recomendación deberías usar el bloque Using

    Al encerrar la declaración del objeto Connection entre un bloque Using ... End Using, nos estaremos asegurando de cerrar la conexión y de destruir los recursos utilizados por el objeto, al finalizar dicho bloque (cuando se ejecute End Using). Con ésto no tenemos que estar pendientes de llamar al método Close (para cerrar la conexión), ni tampoco al método Dispose (para destruir el objeto), por tanto, no es necesario disponer de un procedimiento externo para tales menesteres.

    using (SqlConnection conn = new SqlConnection(...))
    {
        using(SqlCommand cmd = new SqlCommand(..., conn))
        {
            conn.Open();
            using(DataReader dr = cmd.ExecuteReader())      
            {
                 ...
            {
        }
    }

    La mayoría de las 'mejores prácticas' nos dicen para abrir conexiones lo más tarde posible (justo antes de ejecutar cualquier SQL) y el cierre de ellos tan pronto como sea posible (justo después del último bit de datos se han extraído). 

    Cargar combobox vinculado a una tabla

    Espero te sea de utilidad, suerte!!!


    Pedro Ávila
    "El hombre sabio querrá estar siempre con quien sea mejor que él."
    Lima - Perú




    • Editado Pedro Ávila martes, 26 de julio de 2016 13:59 ...
    martes, 26 de julio de 2016 13:39

  • public DataTable SeleccionarRespuestas()
     {
                DataTable mostrar = new DataTable("respuestas");
                try
                {
                    SqlConnection sqlCon = new SqlConnection(this.strConnString);
                    SqlCommand sqlCm = new SqlCommand("s_respuestas", sqlCon);
                    sqlCm.CommandType = CommandType.StoredProcedure;

                    SqlDataAdapter sqlAd = new SqlDataAdapter(sqlCm);
                    sqlAd.Fill(mostrar);
                }
                catch
                {
                    mostrar = null;
                }
                return mostrar;

    }      

                comboBox.DataSource = SeleccionarRespuestas();
                comboBox.DisplayMember = "presentacion_valor";
                comboBox.ValueMember = "valor";                

    • Propuesto como respuesta Misael Alanis lunes, 1 de agosto de 2016 9:13
    lunes, 1 de agosto de 2016 9:13