2017-02-10 52 views
0

我已經知道了,更新控制,我可以使用調用操作更新ListView控件從一個線程不是原來的線程在C#

progressBar1.Invoke(new Action(() => { progressBar1.Maximum = 0; })); 

但是,只有與控制是指單一數據的屬性工作。現在我有一個線程需要更改列表視圖項目的列表視圖集合,清除它然後用新項目,新文本和圖標圖像進行更新。它們之間有什麼不同,一個整數或一個bool與一個列表,一個數組或一組整數,bool甚至組件,控件的集合進行比較。可我只是簡單的添加

string[] newItemText = {"item1", "item2", ...}; 
listView1.Invoke(new Action() => { 
    i = 0; 
    foreach(var item in listView1.Items) 
    { 
     item.Text = newItemText[i]; 
     i++; 
    } 
})); 

我可能需要一個解決方案,我的列表視圖,但如果你有一個答案,請解釋清楚爲什麼,以及如何工作,因爲我需要徹底地瞭解它。你也可以在嘗試這種做法時注意到風險。

編輯:問題不在於如何從其他線程更新控件。有關什麼時候和爲什麼需要這樣做而不是那樣的信息技術。而且,我需要知道更新單個數據和更新整個數據集合的不同之處。

+1

_「我可以簡單地添加」_ - - 當你嘗試時發生了什麼?這與你想要的有什麼不同?根本不清楚你真正的問題是什麼。你似乎明白你需要做什麼。所以......那樣做。如果你在做這件事時遇到了一些麻煩,請解釋一下這個問題到底是什麼。提供一個很好的[mcve],準確顯示你所嘗試的內容,以及對代碼的作用和你希望它做什麼的清晰的詳細解釋。 –

+0

如果你有這麼多的UI工作,你需要重新考慮你的設計。 cpu/IO在後臺工作,UI儘可能在UI線程上工作。比複雜的東西更好。看看異步/等待,它應該有所幫助。請參閱http://blog.stephencleary.com/2012/02/async-and-await.html和資源管理器。 –

+0

[如何從C#中的其他線程更新GUI](http:// stackoverflow。com/questions/661561/how-to-update-the-gui-from-another-thread-in-c) – VMAtm

回答

1

更新值或向列表添加更多元素沒有區別。

內部發生的事情是用於在Windows中繪製的圖形資源(它也可以應用於Android),它需要使用筆,畫筆和這些類型的對象。

這些對象屬於它們最初實例化的線程的上下文。這通常發生在主線程中,但是如果要創建圖形對象(在本例中爲List),則在與主要線程不同的單獨線程中,該特定線程將成爲控件的「所有者」線程。

如果你想改變控制中需要刷新UI的東西(需要使用鋼筆,畫筆等),你必須從「擁有」你的控件的同一個線程那樣做。這就是爲什麼你需要使用Invoke。

這是主要原則。如果將標量值更新爲整數,或者將元素添加到列表中,則沒有差異。兩者都需要使用圖形資源,因此都需要從擁有該控件的同一線程調用。

讓我知道是否清楚。

編輯。無論如何,你的代碼看起來有點奇怪,因爲你正在從自己的列表中填充List迭代。豈不更有意義要做到這一點?:

string[] newItemText = {"item1", "item2", ...}; 
listView1.Invoke(new Action() => { 
    for(int i = 0; i < newItemText.length; i++) 
    { 
    listView1.add(newItemText[i]); 
    } 
}); 

不知道上下文的其餘部分,這聽起來更符合邏輯給我。

+0

好的,如果我們改變UI,那麼它使用UI線程,這是UI的原始線程。但爲什麼我沒有改變任何東西,只是分配或達到特定的價值,並引發了一個例外。像這樣的ListViewItem item = listView1.Items [i];在你的例子中你要分配給文本屬性的 – user3505230

+0

:item.Text = newItemText [i];這正在改變用戶界面。無論如何,你的例子看起來有點奇怪。我將編輯我的帖子,以便表達我認爲你應該做的事情。 – Fernando

+0

那麼,你的代碼只能工作,如果它一次修改列表視圖,如果每次點擊按鈕,列表視圖需要更新它的前景。所以問題是我不知道如何以及爲什麼要這樣做。因爲在其他線程中,我需要讀取要處理的列表視圖文本。所以我的主要問題和我的評論問題是不同的。一個線程是從某處獲取數據來更新我的列表視圖,另一個線程從其他進程的列表視圖中獲取文本,哪一個需要調用會導致無效操作,儘管事實上我只是從後者的列表視圖中讀取數據。 – user3505230