2013-08-29 43 views
2

在一個簡單的.NET WinForm中,我有一個datagridview,它基於單元格的值進行顏色繪製。該代碼正在工作,但呈現的形式是「不穩定的」(當計算機不斷需要重繪並且無法跟上時,這看起來是如此)。我想知道是否有什麼我可以做的,以消除這一點,或者如果我的代碼有問題。建議感激。在.NET 4.5應用程序中導致呈現抖動的CellFormatting事件

private void gvPhoneQueue_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
     { 
      try 
      { 
       if (gvPhoneQueue.Columns[e.ColumnIndex].HeaderText == "CallsWaiting") 
       { 
        string convertedVal = e.Value.ToString(); 
        if (Convert.ToInt32(convertedVal) > _greenTolerance) 
        { 
         gvPhoneQueue.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Green; 
        } 

        if (Convert.ToInt32(convertedVal) > _yellowTolerance) 
        { 
         gvPhoneQueue.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow; 
        } 

        if (Convert.ToInt32(convertedVal) > _redTolerance) 
        { 
         gvPhoneQueue.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red; 
        } 
       } 
      } 
      catch (System.Exception ex) 
      { 
       LogEvent("Error" _+ ex); 
      } 
     } 

回答

2

我已經看到有關這種情況下DataGridView性能問題的某些線程(使用CellFormattingCellPainting,...)。當使用大量數據時,這個可能是是「已知問題」

可以肯定的是,你應該避免在事件中做太複雜的事情。我看不出什麼錯在你的代碼,但它似乎並沒有進行優化

  • 您可以使用3次Convert.ToInt32(convertedVal):你應該保存價值,而不是轉換3次的字符串值。如果您使用的是Try Cath模塊,由於可能存在轉換錯誤,您可以使用int32.TryParse方法。

  • 我猜顏色不能同時爲紅色,黃色或綠色,並且_redTolerence是最高值?因此,您應該先測試最高值,然後測試其他值,然後儘快退出該方法,因此如果不需要,則不要每次評估3 if語句。在VB.Net中,我建議使用ElseIf語句 ,但它不存在於C# 中。在這種情況下使用return將是相同的。 [EDIT 我的錯誤else if in C#等於ElseIf in VB.Net]。


可能優化:

private void gvPhoneQueue_CellFormatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e) 
{ 
    if (gvPhoneQueue.Columns(e.ColumnIndex).HeaderText == "CallsWaiting") { 
     int convertVal = 0; 
     if (int.TryParse(e.Value.ToString, convertVal)) { 
      if (convertVal > _redTolerance) { 
       gvPhoneQueue.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Red; 
      } else if (convertVal > _yellowTolerance) { 
       gvPhoneQueue.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Yellow; 
      } else if (convertVal > _greenTolerance) { 
       gvPhoneQueue.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Green; 
      } 
     } else { 
      //can't convert e.value 
     } 
    } 
} 
+1

感謝,優化的事情做的伎倆。紅色,然後是黃色,然後是綠色是訣竅。令人驚訝的是,雖然我認爲你是在編寫代碼,轉換速度可能在減慢,但單次轉換並沒有加快速度。另外 - 你可以在C#中執行「else if」。 – Darkenor

+0

@Darkenor很高興它有幫助。關於單一轉換,也許我錯了,但我認爲通過第一次優化獲得的性能增益在這裏,但與其他優化獲得的性能增益相比微不足道,因爲我認爲代碼的一部分對資源更爲合理很可能是對「if」陳述的系統評價。感謝Else If的精確度。你是對的,似乎我誤解了一個主題。 C#中的else if等於VB中的ElseIf。我會編輯我的答案。 – Chris

相關問題