none
Evento SelectedIndexChanged con 2 ComboBox RRS feed

  • Pregunta

  • Buen día señores,

    Quería hacer la consulta, ya que soy nuevo, y disculpen mi ignorancia.

    Tengo en mi DB la tabla Componente con las siguiente columnas:

    -cod_componente int

    -nom_componente varchar(##),

    -tipo_componente varchar(##),

    -correlativo varchar(##)

    Ya creo mis formulario para llenar todos esos campos.

    Ahora he creado otro formulario, en donde desea que en el primer ComboBox me aparezca tipo_componente, que ya esta hecho, pero quiero que el el segundo ComboBox me aparezca nom_componente dependiendo del primer combo.

    Osea, si el tipo de componente es HARDWARE y en mi base de datos me aparecen los componentes: MEMORIA RAM, TARJETA DE VÍDEO, PROCESADOR, etc. con tipo de componente HARDWARE entonces el segundo combo se llene con esos nombres. Pero sin me aparece con SOFTWARE, que se llene con los otros componentes que tengan como tipo de componente SOFTWARE. Espero sea entendible mi problema, y espero me puedan ayudar.

    Gracias de antemano.

    viernes, 26 de octubre de 2018 16:30

Todas las respuestas

  • hola, buen día

    como llenas tu primer combo!?,  quiero suponer lo estas haciendo consultando tu tabla, y de esta misma manera deberías llenar tu segundo combo sobre el evento SelectedValueChanged de tu 1er combo condicionando sobre el tipo de componente ... SELECT nom_componente FROM Componente WHERE tipo_componente = '+cmb1.text+' 

    viernes, 26 de octubre de 2018 17:46
  • Hola christian

    Primero te recomiendo comiences por normalizar tu tabla, pues viola la primera forma normal pues tiene "grupos repetitivos", en tu caso tipo de componente debe de tener su propia tabla, te dejo dos enlaces para que revises lo de normalizacion:

    https://es.wikipedia.org/wiki/Primera_forma_normal

    https://cvva.wordpress.com/2007/12/04/normalizacion-de-bases-de-datos-las-3-formas-normales/

    Deberías tener dos tablas:

    TipoComponentes:

    cod_tipo_componente int

    descripcion varchar(##),

    Componentes:

    -cod_componente int

    -cod_tipo_componete int

    -nom_componente varchar(##),

    -correlativo varchar(##)

    Entonces para lograr lo que quieres solo tendrás que establecer las propiedades ValueMember y DisplayMember de tus combobox, el primero debe de tener , ValueMember = "cod_tipo_componente" y DisplayMember= "descripcion" y lo llenas con lo que tenga tu tabla tipos de componente, asi desplegaría SOFTWARE Y HARDWARE, lo mismo con tu otro combobox ValueMember = "cod_componente" y DisplayMember= "nom_componente" y lo llenas con tu tabla filtrada por tipo de componente, lo puedes hacer en el evento SelectedValueChanged de tu combo tipo de componentes, te pongo un ejemplo con código:

            private void Form1_Load(object sender, EventArgs e)
            {
                cboTipoComponente.ValueMember = "cod_tipo_componente";
                cboTipoComponente.DisplayMember = "descripcion";
    
                cboComponentes.ValueMember = "cod_componente";
                cboComponentes.DisplayMember = "nom_componente";
    
                LlenarComboTiposComponentes();
            }
    
            private void LlenarComboTiposComponentes()
            {
                DataTable dtTipoComponente = new DataTable();
                dtTipoComponente.Columns.Add("cod_tipo_componente");
                dtTipoComponente.Columns.Add("descripcion");
    
                DataRow dr = dtTipoComponente.NewRow();
    
                dr["cod_tipo_componente"] = 1;
                dr["descripcion"] = "HARDWARE";
                dtTipoComponente.Rows.Add(dr);
    
                dr = dtTipoComponente.NewRow();
    
                dr["cod_tipo_componente"] = 2;
                dr["descripcion"] = "SOFTWARE";
                dtTipoComponente.Rows.Add(dr);
    
                cboTipoComponente.DataSource = dtTipoComponente;
            }
    
            private void cboTipoComponente_SelectedValueChanged(object sender, EventArgs e)
            {
                if (cboTipoComponente.SelectedValue != null)
                    LlenarComboComponentes(cboTipoComponente.SelectedValue.ToString());
            }
    
            private void LlenarComboComponentes(string TipoComponente)
            {
                DataTable dtComponentes = new DataTable();
                dtComponentes.Columns.Add("cod_componente");
                dtComponentes.Columns.Add("cod_tipo_componente");
                dtComponentes.Columns.Add("nom_componente");
                dtComponentes.Columns.Add("correlativo");
    
                DataRow dr = dtComponentes.NewRow();
    
                dr["cod_componente"] = 1;
                dr["cod_tipo_componente"] = 1;
                dr["nom_componente"] = "MEMORIA RAM";
                dr["correlativo"] = "";
                dtComponentes.Rows.Add(dr);
    
                dr = dtComponentes.NewRow();
    
                dr["cod_componente"] = 2;
                dr["cod_tipo_componente"] = 1;
                dr["nom_componente"] = "PROCESADOR";
                dr["correlativo"] = "";
                dtComponentes.Rows.Add(dr);
    
                dr = dtComponentes.NewRow();
    
                dr["cod_componente"] = 3;
                dr["cod_tipo_componente"] = 2;//codigo tipo componente 2 es SOFTWARE
                dr["nom_componente"] = "VISUAL STUDIO";
                dr["correlativo"] = "";
                dtComponentes.Rows.Add(dr);
    
                DataTable dtComponentesPorTipo = dtComponentes.Select("cod_tipo_componente = " + TipoComponente).CopyToDataTable();
    
                cboComponentes.DataSource = dtComponentesPorTipo;
            }

    Yo estoy llenando los datatable desde mi código, por eso en la función "LlenarComboComponentes" hago el filtro directamente al datatable pero tu lo puedes hacer en la base de datos, lo hice así porque no nos dijiste como estas llenando tu datatable.

    Cualquier consulta a la orden.

    viernes, 26 de octubre de 2018 17:54
  • En el caso del llenado del primer combo uso:

    private void LlenarComboTipo_Componente()
    {
    cbTipo_Componente.DataSource = L_Componentes.Mostrar(); <----- L_Componente es capa de Logica
    cbTipo_Componente.ValueMember = "cod_componente";
    cbTipo_Componente.DisplayMember = "tipo_componente";
    }

    y de ahi en form le hago el:

    this.LlenarComboTipo_Componente();

    Despues de ahi, no se que hacer.

    viernes, 26 de octubre de 2018 18:04
  • Saludos

    Dedicaste tiempo a leer los enlaces que te dejé y a probar el código que hice e intentar adaptarlo?, te recomiendo a que antes de postear otra cosa te asegures de verificar las respuestas que te dan, en serio necesitas crear otra tabla, no te recomiendo que lo continúes haciendo a como vas porque te vas a complicar la vida y no tendrás buenos resultados

    private void LlenarComboTipo_Componente()
    {
    //Esto lo llenas con la tabla que te recomiendo crear
    cbTipo_Componente.ValueMember = "cod_tipo_componente";
    cbTipo_Componente.DisplayMember = "des_tipo_componente";
    cbTipo_Componente.DataSource = L_Componentes.MostrarTiposComponentes();
    //Crea otro método que traiga los tipos de componentes de la tabla que te recomiendo crear
    
    }
    
    private void cboTipoComponente_SelectedValueChanged(object sender, EventArgs e)
    {
    //Cada vez que se seleccione un tipo diferente el combo componentes se volverá a llenar  
    if (cbTipo_Componente.SelectedValue != null)
           LlenarComboComponentes(int.Parse(cboTipoComponente.SelectedValue.ToString()));
    }
    
    private void LlenarComboComponentes(int CodigoTipoComponente)
    {
    cboComponentes.ValueMember = "cod_componente";
    cboComponentes.DisplayMember = "nom_componente";
    cboComponentes.DataSource = L_Componentes.TraerComponentesPorTipo(CodigoTipoComponente);
    //Crea un método que haga un 'select * from Componentes where cod_tipo_componente =  CodigoTipoComponente'
    
    }


    • Editado Yerald Mora viernes, 26 de octubre de 2018 19:12
    viernes, 26 de octubre de 2018 19:10
  • Muchas gracias, intentare hacerlo como me dices. Saludos.
    viernes, 26 de octubre de 2018 19:32