Welcome to WindowsClient.net | Sign in | Join

Here are some frequently asked questions about Windows Forms and their answers.

Windows Forms FAQs

How do I disable a cell?

While a cell can be read-only to prevent it from being editable, the DataGridView does not have built-in support for disabling a cell. Normally the concept of "disabled" means that the user cannot navigate to it and usually has a visual cue that it is disabled. There isn't any easy way to create the navigational side of disabled, but the visual cue is something that can be done. While none of the built-in cell have a disabled property, the following example extends the DataGridViewButtonCell and implements a visual "disabled" state along with a corresponding disabled property.

public class DataGridViewDisableButtonColumn : DataGridViewButtonColumn
{
  public DataGridViewDisableButtonColumn()
  {
    this.CellTemplate = new DataGridViewDisableButtonCell();
  }
}

public class DataGridViewDisableButtonCell : DataGridViewButtonCell
{
  private bool enabledValue;
  public bool Enabled
  {
    get {
      return enabledValue;
    }
    set {
      enabledValue = value;
    }
  }
  // Override the Clone method so that the Enabled property is copied.
  public override object Clone()
  {
    DataGridViewDisableButtonCell cell =
      (DataGridViewDisableButtonCell)base.Clone();
    cell.Enabled = this.Enabled;
    return cell;
  }
  // By default, enable the button cell.
  public DataGridViewDisableButtonCell()
  {
    this.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 (!this.enabledValue)
    {
      // Draw the cell background, if specified.
      if ((paintParts & DataGridViewPaintParts.Background) ==
        DataGridViewPaintParts.Background)
      {
        SolidBrush cellBackground =
        new SolidBrush(cellStyle.BackColor);
        graphics.FillRectangle(cellBackground, cellBounds);
        cellBackground.Dispose();
      }
      // Draw the cell borders, if specified.
      if ((paintParts & DataGridViewPaintParts.Border) ==
        DataGridViewPaintParts.Border)
      {
        PaintBorder(graphics, clipBounds, cellBounds, cellStyle,
          advancedBorderStyle);
      }
      // Calculate the area in which to draw the button.
      Rectangle buttonArea = cellBounds;
      Rectangle buttonAdjustment =
        this.BorderWidths(advancedBorderStyle);
      buttonArea.X += buttonAdjustment.X;
      buttonArea.Y += buttonAdjustment.Y;
      buttonArea.Height -= buttonAdjustment.Height;
      buttonArea.Width -= buttonAdjustment.Width;
      // Draw the disabled button.                
      ButtonRenderer.DrawButton(graphics, buttonArea,
        PushButtonState.Disabled);
      // Draw the disabled button text. 
      if (this.FormattedValue is String)
      {
        TextRenderer.DrawText(graphics,
          (string)this.FormattedValue,
          this.DataGridView.Font,
          buttonArea, SystemColors.GrayText);
      }
    }
    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);
    }
  }
}