我认为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