2012-09-21 21 views
8

tengo una vista de cuadrícula de datos con 4 columnas primero 2 columnas son columnas de cuadro combinado, tercera columna es columna de cuadro de texto y columna 4ta columna de botón.En la carga de formulario tengo que deshabilitar la columna de botón completo de cuadrícula de datos y después de esto, debo seleccionar las primeras tres columnas y guardar estas tres primeras columnas en la base de datos después de guardar esto. La columna del botón en la fila en particular debería habilitarse. Las primeras tres columnas deberían guardarse en datos doblados haciendo clic en un botón. por favor me ayude im entablé con este problema desde muchos días aquí está el código que utilicéDesactivar la columna de botón en la vista de cuadro de datos

private void SATAddTemplate_Load(object sender, EventArgs e) 
{ 
      foreach (DataGridViewRow row in datagrdADDTEMP.Rows) 
      { 

       DataGridViewButtonCell btn = (DataGridViewButtonCell)row.Cells[3]; 
       btn.ReadOnly = true; 
      } 
} 
private void btnSaveSettings_Click(object sender, EventArgs e) 
    { 
      foreach (DataGridViewRow row in datagrdADDTEMP.Rows) 
      { 

       DataGridViewButtonCell btn = (DataGridViewButtonCell)row.Cells[3]; 
       btn.ReadOnly = false; 
      } 
    } 

Respuesta

15

Aquí hay algo de ayuda con el problema de establecer la propiedad Enabled de los botones que aparecen en un DataGridViewButtonColumn.

Tendrá que ampliar DataGridViewButtonColumn para crear su propia columna DataGridView con botones desactivables. This article on MSDN detalles de cómo hacer esto.

El artículo tiene una gran cantidad de código, y me animo a tomar un vistazo de cerca, pero todo lo que realmente necesita hacer es copiar y pegar en su proyecto las siguientes clases encontradas en el artículo:
- DataGridViewDisableButtonColumn
- DataGridViewDisableButtonCell

Una vez hecho esto, podrá agregar DataGridViewDisableButtonColumn a su DataGridView. Use la propiedad pública Enabled expuesta en su columna personalizada para establecer la propiedad Enabled del control Button de cada celda. Puesto que desea establecer la propiedad Enabled de todos los botones en la columna puede escribir un método de ayuda que recorra todas las filas de su DataGridView y establece la propiedad Enabled:

private void SetDGVButtonColumnEnable(bool enabled) { 
    foreach (DataGridViewRow row in dataGridView1.Rows) { 
     // Set Enabled property of the fourth column in the DGV. 
     ((DataGridViewDisableButtonCell)row.Cells[3]).Enabled = enabled; 
    } 
    dataGridView1.Refresh(); 
} 
+7

¿Por qué no es la capacidad de desactivar un botón allí de forma predeterminada, me pregunto? – Coops

+0

El método 'DataGridViewDisableButtonCell.Paint()' en el artículo de MSDN parpadea en repintados (sin doble almacenamiento en búfer). Para remediar, modifique su implementación utilizando [este artículo] (https://msdn.microsoft.com/en-us/library/ka0yazs1 (v = vs.110) .aspx) como guía. Crea un objeto BufferedGraphics (por ejemplo, 'myBuffer'), reemplaza los usos de' graphics' con 'myBuffer.Graphics', y luego llama a' myBuffer.Render() 'al final. Advertencia: La llamada a 'TextRenderer.DrawText()' DEBE especificar estos indicadores de formato de texto para colocar correctamente el texto del botón: 'PreserveGraphicsTranslateTransform | HorizontalCenter | VerticalCenter' –

+0

La solución en este enlace tampoco cubre el relleno en su CellStyle. Puede modificar el Método de pintura para incorporar cualquier Relleno presente en el "estilo de celda" agregando el Relleno.Valor horizontal para ajustar.Anchura de botones y Relleno.Valor vertical para ajustar botones.Altura y agregando Relleno de estilo de celda.Adelante a botónAjuste.X y Padding de cellStyle. Ajuste superior a button.Y. –

5

Se trata de un complemento a la respuesta de Jay.

Por solicitud, aquí está el código que utilicé para crear una celda de botón que podría ser deshabilitada. Incluye doble buffering para que los botones no parpadeen cuando el usuario se desplaza.

/// <summary> 
/// Adapted from https://msdn.microsoft.com/en-us/library/ms171619.aspx. Double-buffering was added to remove flicker on re-paints. 
/// </summary> 
public class DataGridViewDisableButtonCell : DataGridViewButtonCell 
{ 
    private bool enabledValue; 

    public bool Enabled 
    { 
     get { return enabledValue; } 
     set 
     { 
      if (enabledValue == value) return; 
      enabledValue = value; 
      // force the cell to be re-painted 
      if (DataGridView != null) DataGridView.InvalidateCell(this); 
     } 
    } 

    // Override the Clone method so that the Enabled property is copied. 
    public override object Clone() 
    { 
     var cell = (DataGridViewDisableButtonCell) base.Clone(); 
     cell.Enabled = Enabled; 
     return cell; 
    } 

    // By default, enable the button cell. 
    public DataGridViewDisableButtonCell() 
    { 
     enabledValue = true; 
    } 

    protected override void Paint(
     Graphics graphics, 
     Rectangle clipBounds, 
     Rectangle cellBounds, 
     int rowIndex, 
     DataGridViewElementStates elementState, 
     object value, 
     object formattedValue, 
     string errorText, 
     DataGridViewCellStyle cellStyle, 
     DataGridViewAdvancedBorderStyle advancedBorderStyle, 
     DataGridViewPaintParts paintParts) 
    { 
     // The button cell is disabled, so paint the border, background, and disabled button for the cell. 
     if (!enabledValue) 
     { 
      var currentContext = BufferedGraphicsManager.Current; 

      using (var myBuffer = currentContext.Allocate(graphics, cellBounds)) 
      { 
       // Draw the cell background, if specified. 
       if ((paintParts & DataGridViewPaintParts.Background) == DataGridViewPaintParts.Background) 
       { 
        using (var cellBackground = new SolidBrush(cellStyle.BackColor)) 
        { 
         myBuffer.Graphics.FillRectangle(cellBackground, cellBounds); 
        } 
       } 

       // Draw the cell borders, if specified. 
       if ((paintParts & DataGridViewPaintParts.Border) == DataGridViewPaintParts.Border) 
       { 
        PaintBorder(myBuffer.Graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle); 
       } 

       // Calculate the area in which to draw the button. 
       var buttonArea = cellBounds; 
       var buttonAdjustment = BorderWidths(advancedBorderStyle); 
       buttonArea.X += buttonAdjustment.X; 
       buttonArea.Y += buttonAdjustment.Y; 
       buttonArea.Height -= buttonAdjustment.Height; 
       buttonArea.Width -= buttonAdjustment.Width; 

       // Draw the disabled button.     
       ButtonRenderer.DrawButton(myBuffer.Graphics, buttonArea, PushButtonState.Disabled); 

       // Draw the disabled button text. 
       var formattedValueString = FormattedValue as string; 
       if (formattedValueString != null) 
       { 
        TextRenderer.DrawText(myBuffer.Graphics, formattedValueString, DataGridView.Font, buttonArea, SystemColors.GrayText, TextFormatFlags.PreserveGraphicsTranslateTransform | TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter); 
       } 

       myBuffer.Render(); 
      } 
     } 
     else 
     { 
      // The button cell is enabled, so let the base class handle the painting. 
      base.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts); 
     } 
    } 
} 
+0

¡Gracias por publicar este código, esta es la mejor respuesta! – Misiu

+0

Estoy usando esto, pero ¿hay alguna forma de dejar de leer los clics cuando el botón está deshabilitado sin verificarlo en la cuadrícula de datos? – miguelmpn

Cuestiones relacionadas