none
Evitar marcar mas de una vez un checkbox de columna datagridview RRS feed

  • Pregunta

  • Hola, buenas tardes, tengo un datagridview con varias columnas checkbox, como se muestra en el siguiente gráfico:

    Lo que deseo es que al seleccionar un casilla de una columna solo lo pueda hacer una sola vez, me explico mediante un ejemplo: Si selecciono la casilla LUNES de la primera fila, ya no puedo seleccionar otra casilla de la misma columna (LUNES), y así sucesivamente con las demás columnas, en el caso que quite la selección del día LUNES, ahí si pueda seleccionar otra casilla LUNES de las demás filas, pero solo una por columna. 

    En el ejemplo solo tengo creado 2 filas, pero se puede generar más mediante el botón NUEVA LINEA que se ve en el gráfico.

    Cualquier ayuda estar muy agradecido.


    • Editado JCORBETTO martes, 20 de febrero de 2018 21:31
    martes, 20 de febrero de 2018 21:30

Respuestas

  • Lo que puedes hacer es, en vez de evitar que marque otra fila, desmarcar los checks del resto de las filas cuando se marca un check. De esta forma sólo podrá haber uno marcado.

    Para ello puedes comprobar el valor en el evento CellValueChanged si se ha marcado una celda se recorren el resto de filas y se desmarcan las celdas:

    private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
       // Compruebas que se trate de una de las columnas (doy por hecho que son los índices de 0 a 6)
       if (e.ColumnIndex >= 0 && e.ColumnIndex <=6)
       {
          // Comprobamos si el usuario ha marcado o desmarcado la casilla
          var isChecked = (bool)dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
          // Si la ha marcado desmarcamos el todas las filas excepto la actual
          if (isChecked)
          {
             foreach (DataGridViewRow row in dataGridView.Rows)
             {
                if (row.Index != e.RowIndex)
                {
                   row.Cells[0].Value = false;
                }
             }
          }
       }
    }


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 20 de febrero de 2018 21:49
  • hola 

    en el evento dataGridView_CellContentClick

    if ((e.ColumnIndex == DataGridView1.Columns["laColumnadel checkbox"].Index)) {
        DataGridViewCheckBoxColumn_Uncheck();
        DataGridViewCheckBoxCell cell = DataGridView1.Rows[e.RowIndex].Cells["laColumnadel checkbox"];
        cell.Value = cell.TrueValue;
    }

    para deseleccionar

    private void DataGridViewCheckBoxColumn_Uncheck() {
            foreach (DataGridViewRow row in DataGridView1.Rows) {
                DataGridViewCheckBoxCell cell = row.Cells["MyDataGridViewCheckBoxColumn"];
                cell.Value = cell.FalseValue;
            }
            
        }
    UPDATE: la otra es colocar la propiedad VirtualMode true!


    martes, 20 de febrero de 2018 21:53

Todas las respuestas

  • Lo que puedes hacer es, en vez de evitar que marque otra fila, desmarcar los checks del resto de las filas cuando se marca un check. De esta forma sólo podrá haber uno marcado.

    Para ello puedes comprobar el valor en el evento CellValueChanged si se ha marcado una celda se recorren el resto de filas y se desmarcan las celdas:

    private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
       // Compruebas que se trate de una de las columnas (doy por hecho que son los índices de 0 a 6)
       if (e.ColumnIndex >= 0 && e.ColumnIndex <=6)
       {
          // Comprobamos si el usuario ha marcado o desmarcado la casilla
          var isChecked = (bool)dataGridView.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
          // Si la ha marcado desmarcamos el todas las filas excepto la actual
          if (isChecked)
          {
             foreach (DataGridViewRow row in dataGridView.Rows)
             {
                if (row.Index != e.RowIndex)
                {
                   row.Cells[0].Value = false;
                }
             }
          }
       }
    }


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 20 de febrero de 2018 21:49
  • Hola, buenas tardes, tengo un datagridview con varias columnas checkbox, como se muestra en el siguiente gráfico:

    Lo que deseo es que al seleccionar un casilla de una columna solo lo pueda hacer una sola vez, me explico mediante un ejemplo: Si selecciono la casilla LUNES de la primera fila, ya no puedo seleccionar otra casilla de la misma columna (LUNES), y así sucesivamente con las demás columnas, en el caso que quite la selección del día LUNES, ahí si pueda seleccionar otra casilla LUNES de las demás filas, pero solo una por columna. 

    En el ejemplo solo tengo creado 2 filas, pero se puede generar más mediante el botón NUEVA LINEA que se ve en el gráfico.

    Cualquier ayuda estar muy agradecido.


    en que estas trabajando una applicacion de escritorio o  una aplicacion web?

    martes, 20 de febrero de 2018 21:51
  • hola 

    en el evento dataGridView_CellContentClick

    if ((e.ColumnIndex == DataGridView1.Columns["laColumnadel checkbox"].Index)) {
        DataGridViewCheckBoxColumn_Uncheck();
        DataGridViewCheckBoxCell cell = DataGridView1.Rows[e.RowIndex].Cells["laColumnadel checkbox"];
        cell.Value = cell.TrueValue;
    }

    para deseleccionar

    private void DataGridViewCheckBoxColumn_Uncheck() {
            foreach (DataGridViewRow row in DataGridView1.Rows) {
                DataGridViewCheckBoxCell cell = row.Cells["MyDataGridViewCheckBoxColumn"];
                cell.Value = cell.FalseValue;
            }
            
        }
    UPDATE: la otra es colocar la propiedad VirtualMode true!


    martes, 20 de febrero de 2018 21:53
  • Hola greg_dorian, gracias por contestar, estoy tratando de correr el ejemplo y me sale error en estas 2 lineas, las remarco de color negro:

    DataGridViewCheckBoxCell cell = dgvHorarioPasante.Rows[e.RowIndex].Cells["lunes"];

    DataGridViewCheckBoxCell cell = row.Cells["lunes"];

    El error es de conversión implicita


    martes, 20 de febrero de 2018 22:24
  • Hola Ronal, gracias por contestar, la aplicación es de escritorio
    martes, 20 de febrero de 2018 22:25