2010-12-15 4 views
11

Ich habe eine DataGridView, bei der der Hintergrund jeder Zeile abhängig vom Datengebundenen Element unterschiedlich ist. Wenn ich jedoch eine Zeile auswähle, kann ich die ursprüngliche Hintergrundfarbe nicht mehr sehen.DataGridView-Zeile: Semi-transparente Auswahl oder Zeilenrand bei Auswahl

Um dies zu lösen, habe ich von zwei Lösungen gedacht:

ich die Auswahl semi-transparent machen, haben unterschiedliche Hintergrundfarben es möglich, zu sehen, ob zwei ausgewählte Zeilen zu machen.

Or; Ich kann die Auswahlfarben vollständig entfernen und einen Rahmen um die ausgewählten Zeilen zeichnen.

Welche Option ist einfacher und wie kann ich das tun?

Es ist eine WinForm-App.

Edit: Ich landete einige Ihren Code, aufs Geratewohl

private void dgv_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e) 
    { 
     if (dgv.Rows[e.RowIndex].Selected) 
     { 
      var row = dgv.Rows[e.RowIndex]; 
      var bgColor = row.DefaultCellStyle.BackColor; 
      row.DefaultCellStyle.SelectionBackColor = Color.FromArgb(bgColor.R * 5/6, bgColor.G * 5/6, bgColor.B * 5/6); 
     } 
    } 

Dieser den Eindruck einer halbtransparenten Auswahl Farbe verleiht. Danke für Ihre Hilfe!

Antwort

7

Wenn Sie einen Rahmen um die ausgewählten Zeilen zeichnen möchten, können Sie die DataGridView.RowPostPaintEvent verwenden, und ‚klar‘ die Auswahl Farben, können Sie die DataGridViewCellStyle.SelectionBackColor und DataGridViewCellStyle.SelectionForeColor Eigenschaften verwenden.

Zum Beispiel, wenn ich die Zeilenzelle Stil wie dieses

row.DefaultCellStyle.BackColor = Color.LightBlue; 
row.DefaultCellStyle.SelectionBackColor = Color.LightBlue; 
row.DefaultCellStyle.SelectionForeColor = dataGridView1.ForeColor; 

einstellen kann ich diesen Code hinzufügen zu dem RowPostPaintEvent

private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) 
{ 
    if (dataGridView1.Rows[e.RowIndex].Selected) 
    { 
     using (Pen pen = new Pen(Color.Red)) 
     { 
      int penWidth = 2; 

      pen.Width = penWidth; 

      int x = e.RowBounds.Left + (penWidth/2); 
      int y = e.RowBounds.Top + (penWidth/2); 
      int width = e.RowBounds.Width - penWidth; 
      int height = e.RowBounds.Height - penWidth; 

      e.Graphics.DrawRectangle(pen, x, y, width, height); 
     } 
    } 
} 

und eine ausgewählte Reihe wird wie folgt angezeigt:

+0

Ich gab diesem einen Schuss, und es war in Ordnung. Es erschien dann ein neues Problem - transparente Auswahlfarbe sah wirklich hässlich aus (Text war nach altem Text und Zeug, schwer zu erklären;)) nach einer Sorte, also suche ich nach einer anderen Lösung. –

+0

Ich habe Ihren Code verwendet, um stattdessen eine halbtransparente Auswahlfarbe zu erstellen - siehe Bearbeiten. Danke für Ihre Hilfe! –

Verwandte Themen