a veces quiero ocultar botones en un DataGridViewButtonColumn

a veces quiero ocultar botones en un DataGridViewButtonColumn

Hoy tuve el mismo problema. También quería ocultar botones de ciertas filas. Después de jugar con él por un tiempo, descubrí una solución muy simple y agradable, que no requiere ningún paint() sobrecargado. -funciones o cosas similares:

Simplemente asigne un DataGridViewCellStyle diferente a esas celdas.
La clave es que configures el padding propiedad de este nuevo estilo a un valor que desplaza todo el botón fuera del área visible de la celda.
¡Eso es todo! :-)

Muestra:

System::Windows::Forms::DataGridViewCellStyle^  dataGridViewCellStyle2 = (gcnew System::Windows::Forms::DataGridViewCellStyle());
dataGridViewCellStyle2->Padding = System::Windows::Forms::Padding(25, 0, 0, 0);

dgv1->Rows[0]->Cells[0]->Style = dataGridViewCellStyle2;
// The width of column 0 is 22.
// Instead of fixed 25, you could use `columnwidth + 1` also.

Basado en la respuesta de Tobias, hice un pequeño método auxiliar estático para ocultar el contenido de la celda ajustando su relleno.

Sin embargo, tenga en cuenta que todavía se puede "hacer clic" en el botón, ya que si el usuario selecciona la celda y presiona espacio, hace clic en el botón oculto, por lo que verifico que el valor de la celda no sea de solo lectura antes de procesar cualquier clic en mi evento de clic de contenido

  public static void DataGridViewCellVisibility(DataGridViewCell cell, bool visible)
  {
        cell.Style = visible ?
              new DataGridViewCellStyle { Padding = new Padding(0, 0, 0, 0) } :
              new DataGridViewCellStyle { Padding = new Padding(cell.OwningColumn.Width, 0, 0, 0) };

        cell.ReadOnly = !visible;
  }

El relleno no funcionó para mí. Creo que es más fácil y limpio hacer que la celda sea una celda de texto vacía. VB, pero entiendes la idea:

Dim oEmptyTextCell As New DataGridViewTextBoxCell()
oEmptyTextCell.Value = String.Empty
oRow.Cells(i) = oEmptyTextCell