none
Celdas con checkBox en DataGridView RRS feed

  • Pregunta

  • Hola:

    Tengo un datagridview con varias columnas, de las cuales la primera es un checkbox, y la segunda el Titulo de Fila, por decirlo de alguna manera. Quiero hacer lo siguiente:

    Al pinchar en textbox, si este se activa, la fila entera se ponga de un color, por ejemplo rojo.Si está no activo (no checked) que esté en otro color.

    Al pinchar en la columna 2, que es el "Titulo de fila" se ha de activar o desactivar el checkbox (segun el estado anterior) y ponerse la fila entera del color que corresponda segun esté activo o no.

    El primer problema me surge al capturar el valor del checkbox, tanto al pulsar en esa celda como cuando cargo los datos, que debería recorrer todas las filas para saber los valores de los checkbox, aunque no se como hacerlo.

    es que cuando el usuario seleccione el checkbox

    sábado, 28 de agosto de 2010 0:01

Todas las respuestas

  • hola

    El primer problema me surge al capturar el valor del checkbox, tanto al pulsar en esa celda como cuando cargo los datos

    por ahi este link ayude

    [DataGridView] – Uso del CheckBox - DataGridViewCheckBoxColumn

     

    con respecto al resto podrias suar el evento CellClick y alli validar la columnas que se pulsa, para luego usar el

    DefaultCellStyle.BackColor

    usa el e.RowIndex para tomar la fila que lanza el evento

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 28 de agosto de 2010 3:55
  • Hola:

    Gracias por el aparto, mi problema estaba en no usar el CurrentCellDirtyStateChange. Lo que si he notado es que si en vez de usar el evento CellContentClick quieor usar CellClick, para que se seleccione incluso cuando pulse en la parte en blanco de la celda ya no funciona, pues se genera antes el evento CellClick que el evento CellContentClick. Habría alguna forma de poder solucionar esto?


    sábado, 28 de agosto de 2010 10:16
  • hola

    no entendi, porque es que usas ambos eventos, CellClick y CellContentClick

    en realidad deberias solo usar uno de ellos para operar con la seleccion de las celdas

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    sábado, 28 de agosto de 2010 13:22
  • Si, igual lo expliqué mal. He usado los dos porque estaba haciendo pruebas, pero no les usaba a la vez. La idea es usar solo CellClick, para que aunque el usuario pulse en la parte en blanco de la celda funcione igual.

    Por otro lado me ha surgido una duda esta mañana: Cuando cargo los datos a partir de una lista, quiero colorear las filas ocn el checkbox marcado. Lo hago de la siguiente forma:

    foreach (DataGridViewRow row in dgvDias.Rows)
          {
            if (Convert.ToBoolean(row.Cells["Check"].Value))
            {
              row.DefaultCellStyle.BackColor = Color.Green;
              row.DefaultCellStyle.SelectionBackColor = Color.Green;
            }
            else
            {
              row.DefaultCellStyle.BackColor = Color.White;
              row.DefaultCellStyle.SelectionBackColor = Color.White;
            }
          }
    

    El caso es que si lo pongo en el constructor del formulario para que al abrirlo se carguen los datos y despues se coloreen las filas no funciona. Si lo pongo en un evento de boton que pulso despues si que funciona.

    Supongo que es porque intenta hacerlo antes de terminar de cargar los datos o algo así, porlo que tendría que ponerlo desdepués de algún evento del formulario. Como podría ponerlo?

    lunes, 30 de agosto de 2010 11:54
  •  

    El caso es que si lo pongo en el constructor del formulario

    el constructor del formulario no es un lugar aconsejable para cargar controles o establecer estilos de los mismos

    usa el evento Load del formulario

    saludos

     


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 31 de agosto de 2010 3:16
  • Otra pequeña duda, que ya que no habia cerrado este post la pongo aki:

    Tengo una columna de un datagridview que es un checkbox. Lo que quiero conseguir es que cuandoese checkbox tenga el foco, si pulso la tecla enter se seleccione y pase al checkbox de la siguiente fila (hacia abajo). Como puedo hacerlo?

    lunes, 11 de octubre de 2010 18:52
  • hola

    esto lo podrias conseguir usando el

    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData)
    {

        if (!DataGridView1.Focused)
            return base.ProcessCmdKey(ref msg, keyData);

        if (keyData != Keys.Enter)
            return base.ProcessCmdKey(ref msg, keyData);

     
        DataGridViewCell cell = DataGridView1.CurrentCell;
      
        if (cell.ColumnIndex != 0) //esta deberia ser la columna del checkbox
            return base.ProcessCmdKey(ref msg, keyData);

        DataGridView1.CurrentCell = CurrentCell.Rows[cell.RowIndex + 1].Cells[0]; //aqui se selecciona la siguiente fila y la misma celda del checkbox
      

        return true;
    }

    por ahi haya que adaptarlo un poco agregando validacioens, pero creo que la idea estaria

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 11 de octubre de 2010 22:51
  • Supongo que tendré que controlar el que no esté fuera de rango, peor me sirve.

    Otra pregunta:

    Como puedo centrar el texto del encabezado de una columna en un datagridview? (HeaderText)

    miércoles, 13 de octubre de 2010 16:33