2010-12-15 70 views
11

我有一個DataGridView,其中每行的背景根據數據綁定項目而不同。雖然,當我選擇一行時,我不能再看到它的原始背景顏色。DataGridView行:選擇半透明選擇或行邊框

爲了解決這個問題,我曾經想過兩種解決方案:

我可以做的選擇半透明,從而可以查看兩個選擇的行具有不同的背景顏色。

或;我可以完全移除選擇顏色,並在選定的行周圍繪製邊框。

什麼選項更容易,我該怎麼做?

這是一個WinForm應用程序。

編輯:我結束了使用一些代碼的,漂泊

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

這給出了一個半透明的選擇顏色的印象。謝謝你的幫助!

回答

7

如果要圍繞選定行繪製邊框,可以使用DataGridView.RowPostPaintEvent,並「清除」選擇顏色,則可以使用DataGridViewCellStyle.SelectionBackColorDataGridViewCellStyle.SelectionForeColor屬性。

例如,如果設置了這樣

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

行單元樣式我可以將此代碼添加到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); 
     } 
    } 
} 

和所選擇的行會顯示如下:

row with border

+0

我給了這個鏡頭,它很好。然後它出現了一個新問題 - 透明的選擇顏色看起來真的很難看(文本是舊文本和東西,很難解釋;))排序後,所以我會尋找另一種解決方案。 – 2010-12-16 12:33:43

+0

我用你的代碼來創建一個半透明的選擇顏色 - 請參閱編輯。謝謝你的幫助! – 2010-12-17 12:45:18