2009-11-25 37 views
2

在我的winforms應用程序中,我有一個datagridview需要大約0.8秒填充+/- 5000rows - 如果所有列都是文本框列。Winforms Datagridview太慢ImageColumn

其中一列的是一個整數列,所以決定該列改變爲ImageColumn和在網格的Cell_formatting事件,我使用以下代碼來確定要顯示的適當的圖像:

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { 
    if (dgv.Columns[e.ColumnIndex] is DataGridViewImageColumn && e.ColumnIndex == 1) { 
     int cellVal = (int)e.Value; 
     switch (cellVal) { 
      case 1: 
       e.Value = Properties.Resources.Pending; 
       dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ToolTipText = "Item pending attention"; 
       break; 
      case 2: 
       e.Value = Properties.Resources.Tick 
       dgv.Rows[e.RowIndex].Cells[e.ColumnIndex].ToolTipText = "File is available"; 
       break; 
      default: 
       break; 
     } 
    } 
} 

它的工作原理。但是,datagridview現在幾乎需要5秒來填充本身!而排序列只是太耗時。 5秒現在看起來可能不是很多,但在大約2個月的時間內,排就會增長到約30,000!

有沒有更有效的方法來處理這種情況?

謝謝你!

回答

1

如果性能是一個問題,您可以考慮using the DataGridView in virtual mode

+0

嗨再次索林!謝謝回覆。虛擬模式是否有助於數據性能或網格本身的UI性能?如果前者,那麼它不會對我作出差異。我的瓶頸是實際的網格格式事件。我不知道虛擬的綁定模式是否會有所作爲 – Shalan 2009-11-27 12:30:59

+0

嘿,沙蘭。我會說這兩者(儘管對於數據性能來說,事情需要更復雜的方法,如下所示:http://msdn.microsoft.com/en-us/library/ms171624.aspx)。我確實運行了一些簡單的(istic?)測試(預加載的數據,然後以「經典」模式和虛擬模式添加到數據網格中),並且UI提升非常巨大。 – 2009-11-27 12:38:30

+0

「我不知道虛擬綁定模式是否會產生影響」 - 試試看,你會失去什麼? – 2009-11-27 12:39:16

1

這可能無濟於事,但您可以先嚐試進行e.ColumnIndex == 1比較。由於& &是短路運營商,因此您不會評估每個列的dgv.Columns[e.ColumnIndex] is DataGridViewImageColumn

編輯:我真的會使用像Visual Studio Profiler或其他性能工具來找到瓶頸。

+0

探查器只適用於TEAM套件...即時通訊與專業坐。但是我記得在某處看到有一個可用於其他版本的命令行版本。 儘管你的帖子很有意義。我認爲我只是在不考慮額外開銷的情況下保持謹慎。我不知道它會有多大的差異,但我一定會嘗試!謝謝! – Shalan 2009-11-25 23:42:45

1

您是否檢查過瓶頸不在讀取和(可能)調整圖像大小?

如果您以32x32像素(比如說)顯示圖像,但它們存儲爲128x128像素(比如說),那麼每次顯示圖像時都會調整大小。

+0

哎呀!它們都被存儲並用作10x10像素的圖像。我之前忘記提到,我在使用BackgroundWorker進行數據綁定,但它不應該有所作爲,因爲我所經歷的只是影響UI線程 – Shalan 2009-11-25 23:36:34

+0

是否可能有不同的/更好的datagridview事件來處理? – Shalan 2009-11-25 23:38:31

+0

順便說一句 - 每個圖像的文件大小爲579字節 – Shalan 2009-11-25 23:41:02