我想在運行期間將ListViewItem添加到現有的ListView。C#程序停留在myListView.Add(myListViewItem)
我有一個客戶端對象,它是在UI內創建的並與服務器通信,所以我需要在用戶界面更新時通知客戶端某些狀態改變。
我已經使用委託/事件在兩者之間進行通信,事情是我似乎無法更新UI狀態,即使其他一切都通信良好。
我覺得特別奇怪,我可以用完全相同的代碼做到這一點,如果我在UI中添加一個按鈕,單擊它時,將ListViewItem添加到同一個ListView中。
我檢查了收到的數據和由代碼創建的ListViewItem,一切都很好,除了當程序到達應將LV添加到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;
}
}
}
}
任何幫助將不勝感激,因爲我可以看到絕對沒有理由爲它不工作。
雖然我錯過了但可能是一些愚蠢的東西。
是'listOnlineUsers.Items.Add(listViewItem);'調用一個單獨的線程莫名其妙?但我想你會得到一個例外。 – RadioSpace
沒有在其他地方叫過。 UI與代碼的其餘部分是隔離的。也沒有例外,它只是停止運行。如果我在之前和之後放置一張照片,之前發生的一次,那麼後面的照片永遠不會出現。 – rafrochen
您稱之爲事件的方式很奇怪。這是故意的。通常你使用'if(someevent!= null)someevent();' – RadioSpace