2014-04-03 50 views
1

我想在運行期間將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; 
       } 
      } 
     } 
} 

任何幫助將不勝感激,因爲我可以看到絕對沒有理由爲它不工作。

雖然我錯過了但可能是一些愚蠢的東西。

+0

是'listOnlineUsers.Items.Add(listViewItem);'調用一個單獨的線程莫名其妙?但我想你會得到一個例外。 – RadioSpace

+0

沒有在其他地方叫過。 UI與代碼的其餘部分是隔離的。也沒有例外,它只是停止運行。如果我在之前和之後放置一張照片,之前發生的一次,那麼後面的照片永遠不會出現。 – rafrochen

+0

您稱之爲事件的方式很奇怪。這是故意的。通常你使用'if(someevent!= null)someevent();' – RadioSpace

回答

0

在WPF我會用Dispathcer.Invoke(()=>{/*update UI here*/});

但在勝利的形式,我相信這只是ListViewItem.Invoke(somedelgate,params);

msdn for invoke

這裏是另一個資源http://www.codeproject.com/Articles/17688/Updating-the-GUI-from-another-thread-made-easy

的唯一原因,我想你是在一個單獨的線程是因爲你有IAsyncResult參與。

+0

我確實在一個單獨的線程上,事情是:客戶端是一個屬性的ClientWindow。那麼,我可以通過Client對象創建這個非常相同的對象的ClientWindow嗎?它看起來像是一個完整的圈子,並且不健康。 – rafrochen

+0

@rafrochen - 你的意思是[客戶端]公共類客戶端窗口? – RadioSpace

+0

我的意思是客戶端是在ClientWindow內部創建的。而你告訴我要做的是將ClientWindow傳遞給在ClientWindow內部創建的客戶端。某種初始狀態。 – rafrochen