2012-02-03 71 views
2

我一直在試圖解決這個問題,它似乎是一個來自.Net框架的問題。無論如何,我有一個列表視圖,其中包含5000多個項目和一個按鈕,用於對列表視圖中的所選項目進行進一步處理。現在單擊此按鈕也應該將listview的「listview.HeaderStyle」屬性設置爲「ColumnHeaderStyle.Nonclickable」。 現在當我這樣做。該程序掛起了10秒鐘,然後繼續其工作。我不知道是什麼原因導致這種情況發生。我希望你們有這個解決方案。 有什麼想法?爲什麼更改ListView的HeaderStyle會掛起應用程序?

+1

這並不特別讓我感到驚訝,這會造成幾秒鐘的延遲。無論何時設置屬性,該框架可能都會重新創建本機ListView控件,這需要一段時間。值得注意的是,5000+項目在ListView中有很多... – 2012-02-03 04:20:48

+0

是否有任何解決方法? – SolidSnake 2012-02-03 04:23:28

回答

1

我已經找到了基本解決,現在,我需要的是設置

myListview.ColumnClick += new ColumnClickEventHandler(delegate{});

現在我不需要再更改「listview.HeaderStyle」屬性。 基本上我是從HeaderStyle屬性禁用ColumnClick事件,就這些。所以不要將HeaderStyle設置爲nonClickable。我只是刪除/更改事件處理程序中的函數。

0

您可以使用BackgroundWorkerMSDN解決此問題。

注意:即使使用此解決方案您的表單將掛起一段時間。因爲你有5000+項目要綁定到列表,這將阻止你的UI線程,因此winform將掛起。但你的listview.HeaderStyle將被修改。

試試這個

  1. 在按一下按鈕,你的listview.HeaderStyle的PROPERT直接切換到ColumnHeaderStyle.Nonclickable。然後撥打電話RunWorkerAsyncBackgroundWorker
  2. DoWork事件處理程序你做了處理,並且一旦完成將數據綁定到列表視圖。爲此,您需要將以下擴展類添加到您的項目中。

擴展類

public static class ControlExtensions 
{ 
    public static void Invoke(this Control control, Action action) 
    { 
     if (control.InvokeRequired) control.Invoke(new MethodInvoker(action), null); 
     else action.Invoke(); 
    } 
} 

使用這個你可以將數據綁定到ListView的

listview.Invoke(() => (listview.DataSource = dataSource; }); 

希望這對你的作品。

+0

感謝您的想法..但它確實沒有太大區別..我只是想到另一個更簡單的解決方案,它可能不會阻止任何東西......它將Columnclick事件更改爲空函數。 – SolidSnake 2012-02-03 04:52:31

+1

這就是想法,你在後臺線程上做所有的計算,並保持你的UI線程不受它影響。 UI線程應該只處理渲染部分,而不是理想的計算。 – 2012-02-03 04:54:47

相關問題