none
Activar/Desactivar CheckBox de una columna DataGridview RRS feed

  • Pregunta

  • Hola

    Estoy trabajando en una aplicación Windows Forms tengo un objeto DGV el cual tiene una columna de Checkbox la grilla la pueblo de datos por medio de una lista enlazada a datos.

    La lista solo me trae los datos del Id y Descripción están mapeada a la propiedad PropertyName de las columnas de DGV, el problema es que cuando le doy check a las casillas siempre están en value = null no me marca la viñeta o palomita en la casilla.

    Muestro código

    private void dgvIdentificacion_CellValueChanged(object sender, DataGridViewCellEventArgs e)
            {
                ////Solo se trabaja ante los cambios en la columna de los checkbox
                ////
                if (dgvIdentificacion.Columns[e.ColumnIndex].Name == "colChk")
                {
                    //Se toma la fila seleccionada
                    //
                    DataGridViewRow row = dgvIdentificacion.Rows[e.RowIndex];
    
                    //Se selecciona la celda del checkbox
                    //
                    DataGridViewCheckBoxCell cellSelecion = row.Cells["colChk"] as DataGridViewCheckBoxCell;
    
                    //Se valida si esta checkeada
                    //
                    if (cellSelecion != null && !(bool)cellSelecion.Value)
                    {
                        var mensaje =
                            $"Evento CellValueChanged.\n\nSe ha seleccionado, \nDescripción: {row.Cells["colIdenDescripcion"].Value}";
                        MessageBoxEx.EnableGlass = false;
                        MessageBoxEx.Show(mensaje, StrTipoIdentificación.NameEntity, MessageBoxButtons.OK,
                            MessageBoxIcon.Information);
                    }
    
                }
            }
    
            private void dgvIdentificacion_CellContentClick(object sender, DataGridViewCellEventArgs e)
            {
                //Detecta si se ha seleccionado el header de la grilla
                //
                if (e.RowIndex == -1)
                    return;
    
                var elementos = new List<TipoIdentificacion>();
                if (dgvIdentificacion.Columns[e.ColumnIndex].Name == "colChk")
                {
                    //Se toma la fila seleccionada
                    //
                    DataGridViewRow row = dgvIdentificacion.Rows[e.RowIndex];
    
                    //Se selecciona la celda del Checkbox
                    //
                    DataGridViewCheckBoxCell cellSelecion = row.Cells["colChk"] as DataGridViewCheckBoxCell;
                    if (cellSelecion?.Value != null)
                    {
                        if (Convert.ToBoolean(row.Cells["colChk"].Value))
                        {
                            var model = new TipoIdentificacion()
                            {
                                TipoIdentificacionId = Convert.ToInt32(row.Cells["colIdenId"].Value),
                                Nombre = Convert.ToString(row.Cells["colIdenDescripcion"].Value)
                            };
                            elementos.Add(model);
                        }
    
                        if (Convert.ToBoolean(cellSelecion.Value))
                        {
                            var mensaje =
                                $"Evento CellContentClick.\n\nSe ha seleccionado, \nDescripción: {row.Cells["colIdenDescripcion"].Value}";
                            MessageBoxEx.EnableGlass = false;
                            MessageBoxEx.Show(mensaje, StrTipoIdentificación.NameEntity, MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                        }
                        else
                        {
                            if (Convert.ToBoolean(row.Cells["colChk"].Value) == false)
                            {
                                var model = new TipoIdentificacion()
                                {
                                    TipoIdentificacionId = Convert.ToInt32(row.Cells["colIdenId"].Value),
                                    Nombre = Convert.ToString(row.Cells["colIdenDescripcion"].Value)
                                };
                                elementos.Add(model);
                            }
    
    
                            var mensaje =
                                $"Evento CellContentClick.\n\nSe ha quitado la seleccionado, \nDescripción: {row.Cells["colIdenDescripcion"].Value}";
                            MessageBoxEx.EnableGlass = false;
                            MessageBoxEx.Show(mensaje, StrTipoIdentificación.NameEntity, MessageBoxButtons.OK,
                                MessageBoxIcon.Information);
                        }
                    }
                }
            }
    
            private void dgvIdentificacion_CurrentCellDirtyStateChanged(object sender, EventArgs e)
            {
                if (dgvIdentificacion.IsCurrentCellDirty)
                    dgvIdentificacion.CommitEdit(DataGridViewDataErrorContexts.Commit);
    
            }

    Si no me equivoco  cuando selecciono una casilla debería llamar al evento  CurrentCellDirtyChanged y después a CellValueChanged y por ultimo a CellContentClick.

    Lo que pasa es que primero llama a CellValueChanged y después a CellContentClick y nunca llama a CurrentCellDirtyChanged

    Saludos!


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


    sábado, 2 de junio de 2018 22:23

Respuestas

Todas las respuestas