2011-06-08 59 views
3

是什麼在改變的DataGridView一些行背景色的最好方式,當它不是主動更改排顏色不活躍的DataGridView

在「真實」的世界中,我想用它來格式化按鈕點擊後的所有DataGridView行,具體取決於某些標準。

要重現行爲,請嘗試:
1.在WinForms應用程序把TabControl的有兩個標籤頁。在第一個標籤上放按鈕,第二個 - DataGridView
2.使用下面的代碼:

using System; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 

     public int counter = 0; 

     public Form1() 
     { 
      InitializeComponent(); 

      DataTable dt = new DataTable(); 

      dt.Columns.Add("Name", typeof(string)); 
      dt.Columns.Add("Surname", typeof(string)); 
      dt.Rows.Add("Mark", "Spencer"); 
      dt.Rows.Add("Mike", "Burke"); 
      dt.Rows.Add("Louis", "Amstrong"); 

      dataGridView1.DataSource = dt; 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      counter++; 
      this.Text = "Event counter: " + counter.ToString(); 

      dataGridView1.Rows[1].DefaultCellStyle.BackColor = System.Drawing.Color.Red; 
     } 
    } 
} 

我把計數器變量用於測試不同的選擇,看看,多少次換色的事件被觸發(少用爲好;) - 最好只有一次) 。

現在,當你第一次按一下按鈕上沒有tabPage2去,然後切換到tabPage2 - 行的顏色不會改變。這是我的問題。

它會工作時,你第一激活tabPage2,並然後按下按鈕,或者當您編程設置tabControl1.SelectedIndex = 1;,然後色行,然後切換回tabControl1.SelectedIndex = 0; - 但在這種情況下,它「閃爍」。

我也試圖把換色碼cell_painting事件,但對我來說這是矯枉過正 - 它的發射幾百次在很短的時間,甚至當你移動鼠標的DataGridView,而我需要做的只有一次。

你有什麼建議如何解決這個問題?

最好的問候,
馬辛

+0

如何關於'CellFormatting' – V4Vendetta 2011-06-08 10:55:08

+0

@ V4Vendetta:作爲最後一個解決方案 - 是的,但它被解僱了許多次,浪費了CPU時間;) – mj82 2011-06-08 10:56:27

回答

1

一種可能性是在DataGridView油漆事件中的顏色(被炒魷魚的標籤頁更改時)。

private void dataGridView1_Paint(object sender, PaintEventArgs e) 
{ 
    dataGridView1.Rows[0].DefaultCellStyle.BackColor = Color.Red; 
} 

這工作得很好,我 - 當您更改選項卡中的油漆事件不會被調用幾次,所以如果你想只設置DefaultCellStyle一旦你可以這樣做:

public partial class Form1 : Form 
{ 

    private bool setcol; 
    private bool painted; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     setcol = true; 
     painted = false; 
    } 

    private void dataGridView1_Paint(object sender, PaintEventArgs e) 
    { 
     if (setcol && !painted) 
     { 
      painted = true; 
      dataGridView1.Rows[0].DefaultCellStyle.BackColor = Color.Red; 
     } 
    } 
} 
+0

@ mj82一種整理這種方法的方法是繼承datagridview控件,然後把這個邏輯在那裏(也許有一個新的屬性,你可以設置背景顏色) – 2011-06-09 12:07:08