none
DataGridView 變更 Cell 顏色讓 CPU 使用率飆升 RRS feed

  • 問題

  • 我想要 DataGridView 某一 Column 下的 Row 會隨著 變數值改變顏色,
    ex: (變更 Column 1 下的 Row 顏色,Cell 顏色預設值為 白色)
    A = 1 時
    DataGridView1.Rows(1).Cells(1).Style.BackColor = SystemColors.ActiveCaption

    A = 3 時
    DataGridView1.Rows(3).Cells(1).Style.BackColor = SystemColors.ActiveCaption
    但前一個 Cell 要變回原來的顏色
    DataGridView1.Rows(1).Cells(1).Style.BackColor = SystemColors.Windows

    A = 9 時
    DataGridView1.Rows(9).Cells(1).Style.BackColor = SystemColors.ActiveCaption
    前一個 Cell 變回原來的顏色
    DataGridView1.Rows(1).Cells(1).Style.BackColor = SystemColors.Windows

    做成類似跑馬燈的感覺,
    我試著做出這樣的功能卻發現只要 Cell 接續變更顏色(A=1 --> A=2 --> A=3),CPU 使用率就會飆升,

    Dim s As Integer
    
    Private Sub DataGridView1_CellPainting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
    
       Select Case A
                Case 1
                    If Not (s = A) Then
                        DataGridView1.Rows(s - 1).Cells(1).Style.BackColor = SystemColors.Window
                        s = 1
                    End If
    
                    DataGridView1.Rows(0).Cells(1).Style.BackColor = SystemColors.ActiveCaption
    
                Case 2
                    If Not (s = A) Then
                        DataGridView1.Rows(s - 1).Cells(1).Style.BackColor = SystemColors.Window
                        s = 2
                    End If
    
                    DataGridView1.Rows(1).Cells(1).Style.BackColor = SystemColors.ActiveCaption
    
                Case 3
                    If Not (s = A) Then
                        DataGridView1.Rows(s - 1).Cells(1).Style.BackColor = SystemColors.Window
                        s = 3
                    End If
    
                    DataGridView1.Rows(2).Cells(1).Style.BackColor = SystemColors.ActiveCaption
    
                Case 4
                    If Not (s = A) Then
                        DataGridView1.Rows(s - 1).Cells(1).Style.BackColor = SystemColors.Window
                        s = 4
                    End If
    
                    DataGridView1.Rows(3).Cells(1).Style.BackColor = SystemColors.ActiveCaption
       End Select
    End Sub

    不曉得大家可不可以給我這功能的改善建議。
    DataGridView 每 700ms 因繫結的 DataTable 刷新會更新約 80 的 Cell 資料。



    • 已編輯 C.Kevin 2012年9月7日 上午 08:14 補充
    2012年9月7日 上午 07:35

解答

所有回覆

  • 我試著照您的意思做,做了以下的修改。只是把cell顏色的變化放在timer裡。
    請參考
    Form1, Button1, Timer1, DataGridView1

    Public Class Form1
        Dim s As Integer = 1
        Dim A As Short
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Timer1.Enabled = True
        End Sub
        Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
            A += 1
            If A > 4 Then A = 1
            Select Case A
                Case 1
                    If Not (s = A) Then
                        DataGridView1.Rows(s - 1).Cells(1).Style.BackColor = SystemColors.Window
                        s = 1
                    End If
                    DataGridView1.Rows(0).Cells(1).Style.BackColor = SystemColors.ActiveCaption
                Case 2
                    If Not (s = A) Then
                        DataGridView1.Rows(s - 1).Cells(1).Style.BackColor = SystemColors.Window
                        s = 2
                    End If
                    DataGridView1.Rows(1).Cells(1).Style.BackColor = SystemColors.ActiveCaption
                Case 3
                    If Not (s = A) Then
                        DataGridView1.Rows(s - 1).Cells(1).Style.BackColor = SystemColors.Window
                        s = 3
                    End If
                    DataGridView1.Rows(2).Cells(1).Style.BackColor = SystemColors.ActiveCaption
                Case 4
                    If Not (s = A) Then
                        DataGridView1.Rows(s - 1).Cells(1).Style.BackColor = SystemColors.Window
                        s = 4
                    End If
                    c.Rows(3).Cells(1).Style.BackColor = SystemColors.ActiveCaption
            End Select
        End Sub
        Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            DataGridView1.RowCount = 4
            DataGridView1.ColumnCount = 2
        End Sub
    End Class
    


    2012年9月7日 上午 08:09
  • 謝謝您,有試 Timer 的作法,
    當變數 A 值不動時 CPU 使用率維持在 15 ~25% 跳動,DataGridView 每 700ms 因繫結的 DataTable 刷新會更新約 80 的 Cell 資料。
    當 A 值開始改變(ex:  A=1 --> A=2 --> A=3),Cell 跟著變換顏色時,CPU 使用率會忽然升到 80% 以上,使用率大幅上下變動。

    • 已編輯 C.Kevin 2012年9月7日 上午 08:23
    2012年9月7日 上午 08:20
  • FAQ ...

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=SuspendLayout

    論壇是網友平等互助 保證解答請至 微軟技術支援服務


    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。

    2012年9月7日 下午 04:01
  • 我試了 [雙緩沖],SuspendLayout 、ResumeLayout 都沒有改善,

    我把原本使用 DataGridView.CellPainting 事件,改成 Sub,
    SuspendLayout 、ResumeLayout 加至 Select 前 End Select 後。

    滑動水平捲軸很容易出現格子左右錯位的情況,不過馬上就會恢復,
    重直捲軸較沒有這麼問題。
    • 已編輯 C.Kevin 2012年9月10日 上午 08:53
    2012年9月10日 上午 08:48
  • 你變動顏色的時間有點密集。

    如果你的目的是如此,控制項恐怕不能滿足你,控制項因為有太多自動機制在裡面,會造成無效動作一直被觸發。

    如果要類似電動那樣,早期的做法都是做成圖檔,例如 256 色,然後變動調色板內該顏色索引所對應的彩度。

    建議你把目的與邏輯說清楚,大家可以幫你想。


    T.L. Cheng

    2012年9月15日 上午 08:40
    版主