2014-03-06 142 views
1

我正在致力於從System.Windows.Forms.DataGridView派生的自定義DataGridViewDataGridView動態選擇行顏色

在我所期望的網格中,由於它們的狀態,我的行可能具有不同的顏色,我希望當前行與其他行有點不同,並且這種區別在於突出顯示的顏色是動態的而不是靜態的。

當我選擇一排,我只是想保持該行以前的顏色,然後highligh那種顏色比較,我已經做了白衣這個代碼片段:

Color oldColor; 
private void dgvMain_SelectionChanged(object sender, EventArgs e) 
{ 
    oldColor = dgvMain.CurrentRow.DefaultCellStyle.BackColor; 
    Color newColor = Color.FromArgb(oldColor.R < 235 ? oldColor.R + 20 : 0, 
            oldColor.G, oldColor.B); 
    dgvMain.CurrentRow.DefaultCellStyle.BackColor = newColor; 
} 

但我有2個問題:

  1. 當我選擇一行時,首先我的代碼更改行的顏色,然後選中該行,使其顏色更改爲默認選擇顏色。
  2. 當行失去了它的選擇(被deselcted)我無法恢復它的舊顏色 - 我有oldColor,但我不知道什麼時候CurrentRow改變了,我知道有些行的選擇狀態有變化,但我不知道哪一排是我上一行改變它的顏色。

是否有任何解決方法可以做到這一點?任何事件或特殊代碼?


而且,如果您知道突出顯示顏色的更好解決方案,我將非常感謝您的幫助。

回答

2

DefaultCellStyle有一個單獨的屬性SelectionBackColor。用這個來改變選擇的顏色。您可以使用默認的單元格樣式來恢復默認值。

示例代碼:

public class BetterDataGridView : DataGridView 
{ 
    private DataGridViewCellStyle defaultStyle = new DataGridViewCellStyle(); 
    public BetterDataGridView() 
    { 

    } 

    protected override void OnRowStateChanged(int rowIndex, DataGridViewRowStateChangedEventArgs e) 
    { 
     base.OnRowStateChanged(rowIndex, e); 
     if (rowIndex > -1) 
     { 
      DataGridViewRow row = this.Rows[rowIndex]; 
      if (row.Selected) 
      { 
       Color oldColor = this.CurrentRow.DefaultCellStyle.SelectionBackColor; 
       e.Row.DefaultCellStyle.SelectionBackColor = Color.FromArgb(oldColor.R < 235 ? oldColor.R + 20 : 0, 
            oldColor.G, oldColor.B); 
      } 
      else if (!row.Selected) 
      { 
       e.Row.DefaultCellStyle.SelectionBackColor = defaultStyle.SelectionBackColor; 
      } 
     } 
    } 
} 
+0

你的代碼是有幫助的,它只是需要一兩件事,每一行都有它自己的顏色因國家(列之一),當行被取消,我應該重置該行的背景色爲特定的以前的顏色,而不是常見的defaultStyle。 –

+0

@MahdiTahsildari - 只更改SelectionBackColor。該行的BackColor根本沒有被修改。所以,你不必擔心這一點。 – Junaith

+0

是的,我錯過了:)你是對的,謝謝。 –