2010-12-15 71 views
11

J'ai une vue DataGridView dans laquelle l'arrière-plan de chaque ligne est différent en fonction de l'élément lié aux données. Cependant, lorsque je sélectionne une ligne, je ne peux plus voir sa couleur de fond d'origine.Ligne DataGridView: sélection semi-transparente ou bordure de ligne à la sélection

Pour résoudre ce problème, j'ai pensé à deux solutions:

je peux faire semi-transparent les sélections, permettant de voir si deux lignes sélectionnées ont différentes couleurs de fond.

Ou; Je peux supprimer complètement les couleurs de sélection et dessiner une bordure autour des lignes sélectionnées.

Quelle est l'option la plus simple et comment puis-je faire?

C'est une application WinForm.

Edit: Je fini par utiliser une partie de votre code, à la dérive

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

Cela donne l'impression d'une couleur de sélection semi-transparente. Merci de votre aide!

Répondre

7

Si vous voulez dessiner une bordure autour de lignes sélectionnées, vous pouvez utiliser le DataGridView.RowPostPaintEvent, et « claires » les couleurs de sélection, vous pouvez utiliser les DataGridViewCellStyle.SelectionBackColor et DataGridViewCellStyle.SelectionForeColor propriétés.

Par exemple, si je mets le style de cellule de la ligne comme celui-ci

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

Je peux ajouter ce code à la 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); 
     } 
    } 
} 

et une ligne sélectionnée manifesterai comme ceci:

row with border

+0

J'ai donné un coup de feu, et c'était bien. Il est alors apparu un nouveau problème - la couleur de sélection transparente avait l'air vraiment laide (le texte était sur le vieux texte et les choses, difficile à expliquer;)) après une sorte, donc je chercherai une autre solution. –

+0

J'ai utilisé votre code pour créer une couleur de sélection semi-transparente à la place - voir modifier. Merci de votre aide! –