我試圖從文件加載數據列表並立即在Winforms的Datagridview上顯示該數據。爲此,我使用Backgroundworker在另一個線程中進行了閱讀。問題是,它只更新一次,我不能讓它顯示更多的數據。不僅如此,單擊時,它會嘗試訪問具有-1索引的元素,這當然不存在,導致崩潰。Winforms Datagridview無法從委託刷新
通常,從我所看到的情況來看,只需將相同的數據添加到數據源dataGridView1.DataSource = samelist;
即可使用,但在此情況下不起作用。
BackgroundWorker的工作
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
//lotsofCode...
while (readData != null)
{
fooLists.Add(readData);
//someCalculations...
worker.ReportProgress();
}
}
的BackgroundWorker的progressChanged
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.Invoke((MethodInvoker)delegate { UpdateGridView(); });
}
UpdateGridView方法
private void UpdateGridView()
{
if (fooLists.GetListById(1).calculatedList != null)
dataGridView1.DataSource = fooLists.GetListById(1).calculatedList;
}
後來我讀過堆棧,其中一個用BindingSource
所建議的一些線程「中間人「,所以現在我有dataGridView1.DataSource = MyBindingSource;
我n組件初始化和tab1source.DataSource = fooLists.GetListById(1).calculatedList;
而不是dataGridView1.DataSource
。它確實有所幫助,因爲列表現在可以按照它的方式點擊,但列表中仍然只有少量記錄。
沒有dataGridView1.Refresh()
,dataGridView1.RefreshEdit()
或dataGridView1.Update()
幫助,雖然使列表加載稍微有點fancier(可能是由於延遲他們介紹:))。我試圖做一些「保護」(信號量,所以代理不會再次被調用,而工作;嘗試捕獲,雖然沒有例外拋出;重寫前的數據清除...),但「更好的版本「和這個一樣糟糕,只會使代碼變得暗淡。
我錯過了更新Datagridview控件的方法嗎?提前致謝。
fooLists是什麼類型? – WithMetta
@WithMetta這是一個列表清單的自定義類。該方法返回標準列表。 –
Midas
看看https://social.msdn.microsoft.com/Forums/en-US/18a9762e-ac67-48a7-a372-55307fe344f3/how-do-you-refresh-data-bound-to-a-datagridview ?forum = winformsdatacontrols 您可能需要調用父控件的刷新方法。另外我不確定表達式「dataGridView1.DataSource = fooLists.GetListById(1).calculateList;」有效地執行不止一次。想想看。您將數據源設置爲您已經設置的相同對象。如果是這樣的話,它可能會在內部檢查它並且不更新視圖。 – WithMetta