none
Combobox dentro de un datagridview. RRS feed

  • Pregunta

  • Buen día a todos.

    Tengo la siguiente situación: tengo 2 combobox dentro de un dgv, los cuales se cargan desde el Load de manera correcta (los datos estan en la base de datos), lo que pretendo es que cuando seleccione un item (IdUnidad), cargue los datos (catalogados en la base de datos) de ese item en las demas celdas de manera automatica, he realizado lo siguiente con ayuda que he encontrado aqui, pero no he podido hacerlo:

    1. Genere el siguiente evento en mi dgv:

    private void dgvInternalDet_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                DataGridViewComboBoxEditingControl dgvCombo = e.Control as DataGridViewComboBoxEditingControl;

                if (dgvCombo != null)
                {                
                    dgvCombo.SelectedIndexChanged -= new EventHandler(dvgCombo_SelectedIndexChanged);

                    dgvCombo.SelectedIndexChanged += new EventHandler(dvgCombo_SelectedIndexChanged);
                }
            } 

    2.  En el evento SelectedIndexChanged Obtengo el Id de la Unidad segun el valuemember (dato correcto) y hago la consulta en la BD para llenar las celdas correspondientes:

            

    private void dvgCombo_SelectedIndexChanged(object sender, EventArgs e)
            {
                ComboBox combo = sender as ComboBox;

                IdUnidad = Convert.ToInt32(combo.SelectedValue.ToString());

                //CARGAMOS DATATABLE
                var Consulta = @"   SELECT RTRIM(UND.Descripcion) AS Descripcion,
                                    IMPTO.CveImpto,
                                    RET.CveRetencion FROM UNIDADES UND
                                    INNER JOIN IMPUESTOS IMPTO ON(IMPTO.IdImpto = UND.Impuesto)
                                    INNER JOIN RETENCIONES RET ON(RET.IdRetencion = UND.Retencion)
                                    WHERE UND.IdUnidad = @IDUNIDAD";

                SqlCommand cmd = new SqlCommand(Consulta, cn.LeerCadena());
                cmd.Parameters.AddWithValue("@IDUNIDAD", IdUnidad);
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                da.Fill(dt);



                DataGridViewRow row = dgvInternalDet.CurrentRow;

                //LLENAMOS CELDAS SEGUN VALORES DE COMBO
                DataGridViewTextBoxCell CampoDesc = row.Cells["Description"] as DataGridViewTextBoxCell;
                CampoDesc.Value = dt.Rows[0]["Descripcion"].ToString();

                DataGridViewTextBoxCell CampoIVA = row.Cells["IVA"] as DataGridViewTextBoxCell;
                CampoIVA.Value = dt.Rows[0]["CveImpto"].ToString();

                DataGridViewTextBoxCell CampoRET = row.Cells["RET"] as DataGridViewTextBoxCell;
                CampoRET.Value = dt.Rows[0]["CveRetencion"].ToString();

             }

    *Hasta este punto los datos se cargan correcto en las celdas, pero al momento de querer seleccionar un item en el segundo combo se genera un error, ya que entra el evento SelectedIndexChanged y hacer las instrucciones del primer combo.

    Alguien sabe si hay otra manera de hacerlo?

    Gracias de antemano.

    miércoles, 23 de septiembre de 2020 15:32

Respuestas

  • Hola Christian

    Tendrías que verificar en qué columna estás en el método del evento SelectedIndexChanged, para saber cual ComboBox, o sea el de cual columna se seleccionó, y hacer lo correspondiente.

    Para saber el índice de la columna seleccionada:

    dataGridView1.SelectedColumns[0].DisplayIndex

    o

    dataGridView1.CurrentCell.ColumnIndex

    Saludos

    Pablo

    miércoles, 23 de septiembre de 2020 19:45
  • ¿Y ya te funciona como debería?

    Saludos

    miércoles, 23 de septiembre de 2020 21:21
    Moderador

Todas las respuestas

  • Hola Christian

    Tendrías que verificar en qué columna estás en el método del evento SelectedIndexChanged, para saber cual ComboBox, o sea el de cual columna se seleccionó, y hacer lo correspondiente.

    Para saber el índice de la columna seleccionada:

    dataGridView1.SelectedColumns[0].DisplayIndex

    o

    dataGridView1.CurrentCell.ColumnIndex

    Saludos

    Pablo

    miércoles, 23 de septiembre de 2020 19:45
  • Gracias Pablo.

    Es correcto lo que comentas, me faltaba identificar el índice de la columna ya que solo traía el índice de la fila actual, agregue lo siguiente:

     private void dvgCombo_SelectionChangeCommitted (object sender, EventArgs e)
            {
                ComboBox combo = sender as ComboBox;

                //ACCEDEMOS A LA FILA Y COL ACTUAL DEL DGV            
                var _IndexCol = dgvInternalDet.CurrentCell.ColumnIndex;
                var _IndexFila = dgvInternalDet.CurrentRow.Index;

                if (dgvInternalDet.Columns[_IndexCol].Name == "ColUnidad")
                {
                    IdUnidad = Convert.ToInt32(combo.SelectedValue.ToString());

                    //CARGAMOS DATATABLE
                    var Consulta = @"   SELECT RTRIM(UND.Descripcion) AS Descripcion,
                                    IMPTO.CveImpto,
                                    RET.CveRetencion FROM UNIDADES UND
                                    INNER JOIN IMPUESTOS IMPTO ON(IMPTO.IdImpto = UND.Impuesto)
                                    INNER JOIN RETENCIONES RET ON(RET.IdRetencion = UND.Retencion)
                                    WHERE UND.IdUnidad = @IDUNIDAD";

                    SqlCommand cmd = new SqlCommand(Consulta, cn.LeerCadena());
                    cmd.Parameters.AddWithValue("@IDUNIDAD", IdUnidad);
                    SqlDataAdapter da = new SqlDataAdapter(cmd);
                    DataTable dt = new DataTable();
                    da.Fill(dt);


                    //LLENAMOS CELDAS SEGUN VALORES DE LA CONSULTA         
                    dgvInternalDet.Rows[_IndexFila].Cells[4].Value = dt.Rows[0]["Descripcion"].ToString();
                    dgvInternalDet.Rows[_IndexFila].Cells[5].Value = dt.Rows[0]["CveImpto"].ToString();
                    dgvInternalDet.Rows[_IndexFila].Cells[6].Value = dt.Rows[0]["CveRetencion"].ToString();
                }
                
            }       

    miércoles, 23 de septiembre de 2020 20:23
  • ¿Y ya te funciona como debería?

    Saludos

    miércoles, 23 de septiembre de 2020 21:21
    Moderador
  • ¿Y ya te funciona como debería?

    Saludos

    Asi es Oscar
    jueves, 24 de septiembre de 2020 1:51