Manchmal möchte ich Schaltflächen in einer DataGridViewButtonColumn ausblenden

Manchmal möchte ich Schaltflächen in einer DataGridViewButtonColumn ausblenden

Ich hatte heute das gleiche "Problem". Ich wollte auch Schaltflächen bestimmter Reihen ausblenden. Nachdem ich eine Weile damit herumgespielt hatte, entdeckte ich eine sehr einfache und nette Lösung, die kein überladenes paint() erfordert -Funktionen oder ähnliches:

Vergeben Sie einfach einen anderen DataGridViewCellStyle zu diesen Zellen.
Entscheidend ist, dass Sie den padding setzen -Eigenschaft dieses neuen Stils auf einen Wert, der die gesamte Schaltfläche aus dem sichtbaren Bereich der Zelle verschiebt.
Das ist es! :-)

Beispiel:

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.

Basierend auf der Antwort von Tobias habe ich eine kleine statische Hilfsmethode erstellt, um den Inhalt der Zelle zu verbergen, indem ich die Polsterung anpasse.

Beachten Sie jedoch, dass die Schaltfläche immer noch "anklickbar" ist, da der Benutzer, wenn er die Zelle auswählt und die Leertaste drückt, auf die verborgene Schaltfläche klickt. Daher überprüfe ich, dass der Wert der Zelle nicht schreibgeschützt ist, bevor ich Klicks in meinem contentclick-Ereignis verarbeite

  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;
  }

Polsterung hat bei mir nicht funktioniert. Ich denke, es ist einfacher und sauberer, die Zelle einfach zu einer leeren Textzelle zu machen. VB, aber Sie bekommen die Idee:

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