我認爲C#win表格在某些情況下沒有被重新繪製的問題在不同的地方被覆蓋了,但是,我沒有設法通過使用我發現的簡單片段來解決我的問題網頁。C#ListView不更新
我的問題:在窗體上我有一個listView,我把它與一個自定義數據持有者(2列,一個鍵和最後一個更新日期)聯繫起來。從不同的地方,我需要調用updateTime(key)方法,然後複製GUI中的更改。該模型得到改變,但我的listView從來沒有。
我有一個包含一個ListView看起來像一個形式:
partial class VolsPane : UserControl, IGUIPane
{
private ListView listView1;
private ListModel listModel1; //ListModel is 100% homemade
...
public VolsPane()
{
...
listModel1.setList(listView1);
}
}
而對於我的ListView類控股的數據是這樣的:
class ListModel
{
private Dictionary<string, DateTime> Underlying;
private ListView list;
...
public ListModel(string nexusKey)
{
...
}
...
public void setList(ListView list)
{
this.list = list;
}
public void updateTime(string ric)
{
Underlying[ric] = DateTime.UtcNow;
updateView();
}
public void updateView()
{
this.list.Clear();
this.list.Items.AddRange(this.underlyingToListItems());
}
...
public ListViewItem[] underlyingToListItems()
{
ListViewItem[] res = new ListViewItem[Underlying.Keys.Count];
int i = 0;
foreach (string ric in Underlying.Keys)
{
res[i] = new ListViewItem(new string[] { ric, Underlying[ric].ToString("MMM-dd hh:mm:ss") });
i++;
}
return res;
}
}
我意識到問題出在我的updateView()中。在調試中,代碼肯定會去那裏。相信這個問題是與異步「調用」來解決,我提到這個帖子這似乎是一個參考:Stack overflow : Automating the invoke...
然後嘗試這樣:
private void updateView()
{
if (this.list.InvokeRequired)
{
this.list.Invoke(new MethodInvoker(() => { updateView(); }));
}
else
{
this.list.Items.Clear();
//this.list.Clear();
this.list.Items.AddRange(this.underlyingToListItems());
}
}
它建立,但沒有效果。在調試模式下,永遠不會進入'if'分支,總是'else'。
那麼這個:
private void updateView()
{
this.list.Invoke((MethodInvoker)delegate
{
this.list.Items.Clear();
//this.list.Clear();
this.list.Items.AddRange(this.underlyingToListItems());
});
}
我得到一個「:調用或BeginInvoke可直到窗口句柄已創建不能在一個控件調用InvalidOperationException異常。」
我必須在這裏失蹤的顯而易見的事情是什麼?或者,我的問題實際上不是我認爲的問題?
謝謝你們!
嗯,對我不是很清楚,對不起 – Jerome
做了更改,但我仍然得到一個異常 – Jerome
@jerome G:Again:「InvalidOperationException:Invoke或BeginInvoke不能在控件上調用,直到窗口句柄被創建。 「 這意味着控制尚未創建。我不能提供任何建議 這是問題的根源。 – VMykyt