我试图在运行时将ListViewItem添加到现有的ListView。
我有一个在UI内部创建的Client对象,并与服务器通信,因此每当服务器通知客户端某些状态更改时,我都需要更新UI。
我已经使用代理/事件在两者之间进行通信,事情是我似乎无法更新UI状态,即使其他所有内容都正常通信。
我觉得特别奇怪的是,如果我在UI中放置一个按钮,当单击时,将ListViewItem添加到完全相同的ListView中,我可以用完全相同的代码完成它。
我检查了收到的数据和代码创建的ListViewItem,一切都很顺利,只是程序在到达应该将LVI添加到LV的部分时卡住了。
这里有一些相关的代码:
public delegate void MyEventHandler(string uname, bool function);
public partial Class ClientWindow: Form{
public Client c;
public ClientWindow() {
c = new Client();
c.notifyUI += new MyEventHandler(HandleSomethingHappened);
InitializeComponent();
initListView();
}
(...)
void HandleSomethingHappened(string foo, bool op) {
if (foo != c.username && op) {
ListViewItem listViewItem = new ListViewItem(foo);
listOnlineUsers.Items.Add(listViewItem);
}
else
removeUserFromUL(foo);}
}
}
[Serializable]
public class Client : MarshalByRefObject, IClient {
public event MyEventHandler notifyUI;
(...)
void NotifyUI(string uname, bool op) {
Console.WriteLine("notifying");
if (notifyUI != null) {
Console.WriteLine("not null");
Delegate[] invkList = notifyUI.GetInvocationList();
foreach (MyEventHandler handler in invkList) {
try {
IAsyncResult ar = handler.BeginInvoke(uname, op, null, null);
Console.WriteLine("Invoking event handler");
}
catch (Exception e) {
notifyUI -= handler;
}
}
}
}
任何帮助都将受到赞赏,因为我完全没有理由不去工作。
这可能是我想要的愚蠢。
答案 0 :(得分:0)
我会使用Dispathcer.Invoke(()=>{/*update UI here*/});
但是在胜利形式中我相信它只是ListViewItem.Invoke(somedelgate,params);
这是另一个资源http://www.codeproject.com/Articles/17688/Updating-the-GUI-from-another-thread-made-easy
我认为你处于一个单独的线程的唯一原因是因为你涉及IAsyncResult。