2012-04-26 40 views
8

Tengo un winForm con un control DataGridView. Contiene 5 columnas, una de ellas es una columna CheckBox. Quiero habilitar/deshabilitar la celda de casilla de verificación de esta columna en función del valor presente en otra columna en la misma fila.Cómo deshabilitar una celda de casilla de verificación particular en una columna DataGridView CheckBox

puedo desactivar toda la columna usando DisabledCheckBoxCell

pero hace que toda la columna en estado deshabilitado.

Aquí hay un fragmento de DataGridView,

SourceColumn | DestinationColumn
cierto                                 | permitido
cierto                                 | permitido
falsa                               | deshabilitado

¿Alguien tiene idea de cómo se puede lograr esto en .Net.

Respuesta

0

Pruebe usar el evento RowDataBound para su GridView. Puedes lanzar eventargs a la fila, encontrar el control en esta fila y deshabilitarla. Este evento se activa para cada fila de vista de cuadrícula, incluso para encabezados y pies de página, así que intente no detectar excepciones. Aquí hay un código podría ser útil para usted

protected void xxx_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if ((e.Row != null) && e.Row.RowType == DataControlRowType.DataRow) 
+0

Quiero desactivar la celda de la fila respectiva, no pude encontrar inmuebles habilitado en una célula. Estoy usando el evento RowPostPaint. –

+0

¿No están las formas de ganar? –

+0

Me temo que no puede haber ninguna función para desactivar una celda individual, pero puede hacer algo mientras se hace clic en la celda, por ejemplo, para revertir el valor de la celda que desea desactivar – Nick

20

Vijay,

DataGridViewCheckBoxColumn no haber propiedad llamada desactivada de manera cambiando el estilo de la casilla de verificación se puede hacer que parezca como si está desactivado. Mira el siguiente código.

private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) 
    { 
     if (e.RowIndex == 1) 
     { 
      DataGridViewCell cell=dataGridView1.Rows[e.RowIndex].Cells[0]; 
      DataGridViewCheckBoxCell chkCell = cell as DataGridViewCheckBoxCell; 
      chkCell.Value = false; 
      chkCell.FlatStyle = FlatStyle.Flat; 
      chkCell.Style.ForeColor = Color.DarkGray; 
      cell.ReadOnly = true; 

     } 

    } 
+0

Gracias por su respuesta. Esto está funcionando con algunos problemas menores.También tengo celdas de casillas de verificación en los encabezados de las columnas. Esto los está afectando también. Cuando cambio a otra aplicación y regreso a la aplicación original, la interfaz de usuario se ve distorsionada. –

1

que terminé haciendo algo como esto para tener una casilla de verificación desactivada real a aparecer:

using System.Windows.Forms.VisualStyles; 

public partial class YourForm : Form 
{ 

    private static readonly VisualStyleRenderer DisabledCheckBoxRenderer; 

    static YourForm() 
    { 
     DisabledCheckBoxRenderer = new VisualStyleRenderer(VisualStyleElement.Button.CheckBox.UncheckedDisabled); 
    } 

    private void dataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) 
    { 
     if (e.RowIndex > -1) 
     { 
      int checkBoxColumnIndex = this.yourCheckBoxColumn.Index; 
      var checkCell = (DataGridViewCheckBoxCell)this.dataGridView[checkBoxColumnIndex, e.RowIndex]; 
      var bounds = this.dataGridView.GetCellDisplayRectangle(checkBoxColumnIndex , e.RowIndex, false); 

      // i was drawing a disabled checkbox if i had set the cell to read only 
      if (checkCell.ReadOnly) 
      { 
       const int CheckBoxWidth = 16; 
       const int CheckBoxHeight = 16; 

       // not taking into consideration any cell style paddings 
       bounds.X += (bounds.Width - CheckBoxWidth)/2; 
       bounds.Y += (bounds.Height - CheckBoxHeight)/2; 
       bounds.Width = CheckBoxWidth; 
       bounds.Height = CheckBoxHeight; 

       if (VisualStyleRenderer.IsSupported) 
       { 

        // the typical way the checkbox will be drawn 
        DisabledCheckBoxRenderer.DrawBackground(e.Graphics, bounds); 
       } 
       else 
       { 

        // this method is only drawn if the visual styles of the application 
        // are turned off (this is for full support) 
        ControlPaint.DrawCheckBox(e.Graphics, bounds, ButtonState.Inactive); 
       } 
      } 
     } 
    } 
} 
Cuestiones relacionadas