martes, 6 de diciembre de 2011

Como llenar un Combo Box en C#

Es bastante sencillo, lo que vamos a realizar es llenar un combobox de windows form extrayendo los datos desde una BD.

Siempre me a gustado trabajar en capas por eso les mostrare desde como hacer el SP (Store Procedure) el llamado de una clase, y la aplicación en el Form

Bueno el SP es un código que me va a traer en este caso los roles de un sistema y los campos que retorna son el Id y el Nombre

SP:
       CREATE procedure[dbo].[trae_datos_roles]
        as
        begin
        select Id_rol, Nombre_rol from Tbl_rol
        end

Luego que tenemos el SP funcionado pasamos al llamado a alguna clase en este caso le llame Roles

 public DataSet retorna_roles()
        {
            Nombre_Sp = "trae_datos_roles";
            ds = cargar_dataset(Nombre_Sp, ref mensaje_error, ref numero_error);
            if (numero_error == 0)
                return ds;
            else
                return null;

En este código se esta usando otra clase llamada UtilidadesBD(Valida las conexiones) que se conecta con la Clase DAL(Lenguaje de acceso a datos) en este caso lo que se manda por parámetros es el nombre del SP y este devuelve un Data Set con la información requerida (Si necesitan las otras clases escríbanme y se las puedo pasar)

Con eso ahora podemos cargar nuestro combo box en el form

Yo cree un procedimiento para llamar a la carga de este combo box de esta manera:

Nomenclatura= cb = combo box , ds = DataSet


  void carga_roles()
        {
            objroles = new Roles();
            ds = new DataSet();
           ds = objroles.retorna_roles();
           cb_roles.DataSource = ds.Tables[0];
           cb_roles.DisplayMember = ds.Tables[0].Columns["Nombre_rol"].ColumnName;
           cb_roles.ValueMember = ds.Tables[0].Columns["Id_rol"].ColumnName;
           objroles = null;
            
        }

Bueno para explicar un poco al inicio llamo a la Clase Roles que vimos ahora la inicializo, luego creo un data set y lo inicializo también, luego cargo se data set con el data set que me retorna el procedimiento de la Clase roles.

Cargo se data set al combo box con la propiedad DataSource.
Luego evaluó para saber que es lo que necesito mostrar al usuario final y cual es el valor que voy a utilizar en mi código para esto están las propiedades DisplayMember y ValueMember como se utiliza en el código anterior

Con esto vamos a tener un combo box cargado con items de la base de datos


15 comentarios:

  1. hola brother, me gusta tu ejemplo y me gustaria que me ayudaras en un pequeño proyecto que estoy desarrollando en capas y procedimientos almacenados... En como llamar desde un combobox datos de un bbdd en sqlserver con storeprocedure.

    ResponderEliminar
  2. tambien quisiera saber el evento a utilizar... este es un ejemplo en un txt y me funciona correctamente:
    NegFarmacia farmaci = new NegFarmacia();
    DataTable tbdatos = new DataTable();

    tbdatos = farmaci.mostrar(txtLocalidad.Text);
    DGVFarmacias.DataSource = tbdatos;

    ResponderEliminar
  3. Hola amigo en el caso del combo puedes usar un evento del combobox que se llama SelectedIndex_Changed

    Y la del txt no entiendo tu pregunta!!

    Saludos y bendiciones

    ResponderEliminar
  4. Hola de nuevo, mi nombre es Ramiro y soy de Nicaragua. Estoy haciendo un proyecto para mi tesis y se trata de un sistema de Escritorio en Visual C# 2010 con SQL server 2008 por ahora local y con procedimientos almacenados y en 3 capas (Negocio, Datos y Presentación). Se trata del llenado de datos de un monitoreo… El problema que tengo por ahora es:
    Tengo 1 tabla llamada Farmacia con los atributos (Municipio, Categoría, Nombre_Farmacia), donde ya existen datos de cada uno. Ahora yo quiero en cada atributo desde mi formulario mandarlo a llamar desde un combobox, pero que al elegir mi opción desde el primero, se me autocomplete el que sigue y así sucesivamente… y que al final me muestre todos esos datos en un datagridview.

    ResponderEliminar
  5. Mi procedimiento almacenado para mostrar primero el municipio es:
    ALTER PROCEDURE dbo.Buscar_MunicipioReportes
    @Municipio varchar(25)
    AS
    select Municipio from Farmacia where Municipio=@Municipio

    RETURN

    ResponderEliminar
  6. En mi capa de negocios para la tabla Farmacia:
    class NegFarmacia
    {
    #region //Declaración de las Variables, Parte de la Capa de Negocio

    private int Id_Farmacia;
    private string Categoria;
    private string Localidad;
    private string Municipio;
    private string msg;

    #endregion

    #region //Propiedades Metodos(Get y Set)

    public int _Id_Farmacia
    {
    get { return Id_Farmacia; }
    set { Id_Farmacia = value; }
    }

    public string _Categoria
    {
    get { return Categoria; }
    set { Categoria = value; }
    }

    public string _Localidad
    {
    get { return Localidad; }
    set { Localidad = value; }
    }

    public string _Municipio
    {
    get { return Municipio; }
    set { Municipio = value; }
    }
    #endregion

    ResponderEliminar
  7. #region Busqueda de municipio para el combobox
    public DataTable buscar_Municipio(string Municipio)
    {

    dtFarmacia farm = new dtFarmacia();
    _Municipio = Municipio;
    return farm.buscar_municipio(this);
    }
    #endregion

    ResponderEliminar
  8. Mi capa de Acceso a Datos siempre para la tabla Farmacia:
    #region BUSQUEDA DE MUNICIPIO PARA EL COMBOBOX

    public DataTable buscar_municipio(NegFarmacia datos)
    {
    DataTable dtfarmac = new DataTable();
    DbProviderFactory Factory = DbProviderFactories.GetFactory(Conexion._proveedor);
    DbCommand comando = datosgenericos.crearcomando();
    comando.CommandText = "Buscar_MunicipioReportes";
    comando.CommandType = CommandType.StoredProcedure;

    DbParameter muni = Factory.CreateParameter();
    muni.ParameterName = "@Municipio";
    muni.Value = datos._Municipio;
    comando.Parameters.Add(muni);
    try
    {

    return datosgenericos.ExecuteReader(comando);

    }

    catch (Exception ex)
    {
    throw ex;
    }

    }
    #endregion

    ResponderEliminar
  9. En la capa de Acceso a Datos agregué un clase llamada Conexión y otra llamada Datos Genéricos:

    class Conexion
    {
    private static string cadenaconexion = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\apd_sismonfarma.mdf;Integrated Security=SSPI;User Instance=True";
    private static string proveedor = "System.Data.SqlClient";

    public static string _cadenaconexion
    {
    get { return cadenaconexion; }
    }

    public static string _proveedor
    {
    get { return proveedor; }
    }
    }

    ///////////////////////////////////
    Datos Genéricos:

    class datosgenericos
    {
    public static bool buscar(DbCommand command)
    {

    try
    {
    command.Connection.Open();
    DbDataReader reader = command.ExecuteReader();
    return reader.Read();
    }
    catch (Exception ex)
    {
    throw ex;
    //command.Connection.Close();

    }
    finally
    {
    command.Connection.Close();
    }

    }
    public static DataTable ExecuteReader(DbCommand command)
    {
    DataTable table;
    try
    {
    command.Connection.Open();
    DbDataReader reader = command.ExecuteReader();
    table = new DataTable();
    table.Load(reader);
    }
    catch (Exception ex)
    {
    throw ex;


    }
    finally
    {
    command.Connection.Close();
    }
    return table;
    }

    //Crear comando generico para compatibilidad con cualquier proveedor(oracle,mysql,sql)
    public static DbCommand crearcomando()
    {
    string cadenaconexion = Conexion._cadenaconexion;
    string proveedor = Conexion._proveedor;

    DbProviderFactory factory = DbProviderFactories.GetFactory(proveedor);
    DbConnection connection = factory.CreateConnection();
    connection.ConnectionString = cadenaconexion;
    DbCommand comando = connection.CreateCommand();
    comando.CommandType = CommandType.StoredProcedure;

    return comando;

    }

    public static int modificar(DbCommand command)
    {

    int columnas_afectadas = -1;
    try
    {
    command.Connection.Open();
    columnas_afectadas = command.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
    throw ex;
    }
    finally
    {
    command.Connection.Close();
    }
    return columnas_afectadas;
    }


    public static string valor_string(DbCommand command)
    {
    string valor = "";
    try
    {
    command.Connection.Open();
    valor = command.ExecuteScalar().ToString();
    }
    catch (Exception ex)
    { throw ex; }
    finally
    {
    command.Connection.Close();
    }
    return valor;
    }

    }

    ResponderEliminar
  10. Te agradezco de todo corazón tu ayuda... Me encantaría que me ayudaras y nos pusiéramos en contacto para conocernos... Saludes y gracias de nuevo...

    ResponderEliminar
  11. hola Bro... ya lo conseguí; si quieres te puedo dar como resolverlo...

    ResponderEliminar
  12. Buenas noches!!
    quisiera preguntarte como se puede hacer que al seleccionar algun item en el combo box, se muestren los datos enlazados a el, como por ejemplo tengo un combo box que me muestre los diferentes estados de la republica y al seleccionar algun estado mostrar en otro combo box los municipios

    ResponderEliminar
  13. me podrias pasar las otras clases por favor? mi correo es alexandra.pool@hotmail.com

    ResponderEliminar