2010-12-16 48 views
18

¿Cómo puedo hacer que algunas celdas en DataGridView no sean seleccionables?DataGridView: ¿Cómo hacer que algunas celdas sean no seleccionables?

Por 'no seleccionable' quiero decir: no se puede seleccionar de ninguna manera y al intentar seleccionarlo no se deseleccionará ninguna otra celda.

No me refiero a ReadOnly. Mis células ya tienen esta propiedad como verdadera.

DataGridView.MultiSelect debe ser falso.

Gracias a la respuesta de JYL yo escribimos un código:

private int selectedCellRow = 0; 
    private int selectedCellColumn = 0; 

    private void grid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e) 
    { 
     if (e.Cell == null || e.StateChanged != DataGridViewElementStates.Selected) 
       return; 

     if (e.Cell.RowIndex == 0 || e.Cell.ColumnIndex == 0 || e.Cell.RowIndex == 1 && e.Cell.ColumnIndex == 1) 
     { 
      e.Cell.Selected = false; 
      grid.Rows[selectedCellRow].Cells[selectedCellColumn].Selected = true; 
     } 
     else 
     { 
      selectedCellRow = e.Cell.RowIndex; 
      selectedCellColumn = e.Cell.ColumnIndex; 
     } 

     //this was only for seeing what is happening 
     //this.Text = selectedCellRow + " " + selectedCellColumn; 
    } 

Pero esto conduce a StackOverflow. ¿Qué condición y dónde debo poner para prevenir eso?

+0

¿Quieres decir un-editable? ¿Al igual que algunas de las celdas son de solo lectura? –

Respuesta

14

Agregó y comentó la condición por la que estaba preguntando.

private int selectedCellRow = 0; 
private int selectedCellColumn = 0; 

private void grid_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e) 
{ 
    if (e.Cell == null || e.StateChanged != DataGridViewElementStates.Selected) 
     return; 

    //if Cell that changed state is to be selected you don't need to process 
    //as event caused by 'unselectable' will select it again 
    if (e.Cell.RowIndex == selectedCellRow && e.Cell.ColumnIndex == selectedCellColumn) 
     return; 

    //this condition is necessary if you want to reset your DataGridView 
    if (!e.Cell.Selected) 
     return; 

    if (e.Cell.RowIndex == 0 || e.Cell.ColumnIndex == 0 || e.Cell.RowIndex == 1 && e.Cell.ColumnIndex == 1) 
    { 
     e.Cell.Selected = false; 
     grid.Rows[selectedCellRow].Cells[selectedCellColumn].Selected = true; 
    } 
    else 
    { 
     selectedCellRow = e.Cell.RowIndex; 
     selectedCellColumn = e.Cell.ColumnIndex; 
    }  
} 
+0

Esto funciona :). Gracias –

+0

Una mejora leve podría ser referirse a la llamada DataGridView a través de 'e.Cell.DataGridView' y no usar' grid'. De cualquier forma, el evento requerirá alguna "ayuda externa" a través de los índices de columna y fila seleccionados. Buena solución. –

6

Puede utilizar el evento "CellStateChanged".

private void DataGridViewXYZ_CellStateChanged(object sender, DataGridViewCellStateChangedEventArgs e) 
{ 
       if (e.Cell == null 
        || e.StateChanged != DataGridViewElementStates.Selected) 
        return; 
       if (! [condition here : can this cell be selectable ?]) 
        e.Cell.Selected = false; 
} 

EDIT: si se deja la propiedad MultiSelect de GridView en True, puede dirigirse a sí mismo un "solo seleccionar" gridview con células no seleccionables: il la célula es seleccionable, desactive la otra selección ...

+0

Creo que esto evitaría que se seleccionara la celda, pero no impedirá que la celda anterior se desmarque. –

+0

Ver mi edición ... Es bastante fácil hacerlo. – JYL

+0

Con multiselect en true, no tienes ningún problema con mi código ... porque Multiselect a verdadero no deseleccionará una celda cuando hagas clic en otra. EDITAR: su condición general está presente en mi muestra ... – JYL

Cuestiones relacionadas