2016-03-20 6 views
1

Ich versuche, den Standard DataGridViewCheckBoxCell mit einem farbigen Rechteck zu überschreiben.Ändern von DataGridViewCheckBoxCell Hintergrundfarbe in CellPainting

ich folgenden Beitrag gefunden, aber es so nicht verhalten erwartet: Drawing a filled circle or rectangle inside a DataGridViewCell in C# Winforms

Hier ist mein Code: zum ersten Mal

private void OrdersComponentsDGV_CellPainting(object sender, DataGridViewCellPaintingEventArgs e) 
{ 
    if (e.RowIndex >= 0 && e.ColumnIndex > 0) 
    { 
     const float size = 20; 

     var datagridview = (sender as DataGridView); 
     var cell = datagridview.Rows[e.RowIndex].Cells[e.ColumnIndex]; 

     if (cell.Value != DBNull.Value && (bool)cell.Value) 
     { 
      // center of the cell 
      var x = e.CellBounds.X + e.CellBounds.Width/2 - size/2; 
      var y = e.CellBounds.Y + e.CellBounds.Height/2 - size/2; 

      RectangleF rectangle = new RectangleF(x, y, size, size); 
      e.Graphics.FillRectangle(Brushes.Yellow, rectangle);      
      e.PaintContent(e.CellBounds);      
      e.Handled = true; 
     } 
    } 
} 

Nach dem Laden, haben alle überprüft Zellen eine graue Hintergrundfarbe . Es verschwindet nach dem Scrollen der Datagridview nach unten und nach oben zurück.

Illustration: enter image description here

Darüber hinaus habe ich das Datagridview Selection zu FullRowSelect gesetzt:

OrdersComponentsDGV.SelectionMode = DataGridViewSelectionMode.FullRowSelect; 

Aber nachdem ich CellPainting implementieren, wie oben beschrieben, die blaue Auswahl Hintergrundfarbe wird in dem Bild verschwunden (siehe) wo das Kontrollkästchen aktiviert ist.

Antwort

1

können Sie Basis Hintergrund Malerei-Methode verwenden, bevor Sie Ihre eigenen Rechteck zeichnen (wie Dokumentation für DataGridView.CellPainting Event schlägt)

if (cell.Value is bool && (bool)cell.Value) 
{ 
    e.PaintBackground(e.ClipBounds, cell.Selected);  

    // center of the cell 
    var x = e.CellBounds.X + e.CellBounds.Width/2 - size/2; 
    var y = e.CellBounds.Y + e.CellBounds.Height/2 - size/2; 

    RectangleF rectangle = new RectangleF(x, y, size, size); 
    e.Graphics.FillRectangle(Brushes.Yellow, rectangle); 

    e.PaintContent(e.ClipBounds); 

    e.Handled = true; 
} 
+0

Danke @Ash es die beiden Probleme gelöst. – ehh