C# Llenar ComboBox con una consulta SQL Server


Para esta entrada haremos uso de la conexión a la base de datos que creamos en la entrada anterior.
Crearemos un control ComboBox para nuestro Form haciendo uso del Cuadro de Herramientas y en el recuadro de propiedades de este control le cambiamos el nombre por “CBListas”, que es la manera en que podremos usar dicho control.

Por otra parte, usaremos una estructura de try catch que nos permitirá captar información básica de los errores en una presentación de un mensaje donde se incluirá la siguiente información:
  • Nombre del equipo, donde se ejecuta la aplicación.
  • Usuario, que ejecuta la aplicación.
  • Mensaje, El error que se esta presentando.
  • Proyecto, Nombre del proyecto.
  • Clase, Nombre de la clase.
  • Método, Nombre del método.
  • Línea, donde se presenta el error.

Por el momento, solo se reúne dicha información y es presentada en un mensaje al usuario, pero a futuro se desea hacer un log en el servidor de base de datos, tanto de procesos y errores para poder tener una herramienta sobre la cual se pueda hacer un estudio estadísticas y determinar mejoras y correcciones del aplicativo.

A continuación, mostramos la función para el llenado del control ComboBox “CBListas”:



public void cargaCBLISTAS()
{
    try
    {
        using (SqlConnection cnn = Conexion.Conectar("conexionBD"))
        {
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter("SELECT [id_Lista],[Nombre_Lista] " +
                                        "FROM [DataBaseTelefonia].[dbo].[Listas] " +
                                        "WHERE [Estatus] = 1 " +
                                        "ORDER BY [id_Lista] ASC", cnn);
            da.Fill(ds, "Listas");
            CBListas.DataSource = ds.Tables[0].DefaultView;
            //se especifica el campo de la tabla
            CBListas.DisplayMember = "Nombre_Lista";
            CBListas.ValueMember = "id_Lista";
            cnn.Close();
        }
    }
    catch (System.Exception ex)
    {
        StackTrace st = new StackTrace(ex, true);
        StackFrame frame = st.GetFrames().Where(f => !String.IsNullOrEmpty(f.GetFileName())
            && f.GetILOffset() != StackFrame.OFFSET_UNKNOWN
            && f.GetNativeOffset() != StackFrame.OFFSET_UNKNOWN
            && !f.GetMethod().Module.Assembly.GetName().Name.Contains("mscorlib")).First();
        string MachineName = System.Environment.MachineName;
        string UserName = System.Environment.UserName.ToUpper();
        string Mensaje = ex.Message;
        int LineaError = frame.GetFileLineNumber();
        string Proyecto = frame.GetMethod().Module.Assembly.GetName().Name;
        string Clase = frame.GetMethod().DeclaringType.Name;
        string metodo = frame.GetMethod().Name;
        MessageBox.Show(string.Format(
                   "NOMBRE DEL EQUIPO:" + MachineName +
                   "{0}USUARIO:  " + UserName +
                   "{0}MENSAJE: " + Mensaje +
                   "{0}PROYECTO:  " + Proyecto +
                   "{0}CLASE:  " + Clase +
                   "{0}METODO:  " + metodo +
                   "{0}LINEA DEL ERROR:  " + LineaError, Environment.NewLine));
    }
}



Si ponemos un poco de atención al código podemos ver que después de la consulta se asignan dos valores de manera simultánea al ComboBox, uno de ellos es el ID de la tabla a la que consultamos y el otro el valor que será mostrado al usuario.

CBListas.DisplayMember = "Nombre_Lista";
CBListas.ValueMember = "id_Lista";



Pero ahora ¿cómo recupero el ID que tengo seleccionado en el ComboBox “CBListas” para hacer otra consulta relacionada con dicho ID? Bueno solo ponemos la siguiente línea para obtener el ID que esta seleccionado en el ComboBox.

label3.Text = CBListas.SelectedValue.ToString();



Para mostrar o sacar el valor visible seleccionado del ComboBox no es mucho más complicado que una línea de código.

label3.Text = CBListas.GetItemText(CBListas.SelectedItem);



Y como pilón les pasare las tres líneas que siempre nos ayudan a limpiar los ComboBox ya sea porque la lógica de la aplicación requiera que se des-habiliten y se limpien para ser llenados con una nueva consulta cuando sea necesario o por la simple acción de actualizar su contenido.

CBListas.DataSource = null;
CBListas.Items.Clear();

CBListas.ResetText();



Debo hacer inca pie en que existen muchas formas para manejar los errores y que quizá esta no sea la más correcta, pero por el momento para el proceso de desarrollo me parece más funcional, por lo que les pido enriquezcan dicha función sugiriendo mejoras o cambios si así lo creen pertinente.

Comentarios