2010-05-17 76 views
3

首先,我有點新的C#從..函數填充列表框?

我試圖做這樣的事情在C#WinForms應用程序

當我的應用程序啓動後,在系統盤最小化的形式開始。當我雙擊它時,它會打開並向qpid經紀人發送一些請求。則消息在我的應用程序發回,並獲得在監聽器(我不知道代碼是相關的,但無論如何,我會張貼)

namespace MyApp 
{ 
    public class MyListener : IMessageListener 
    { 
     public void MessageTransfer(IMessage m) 
     { 
      //do stuff with m 
     } 
    } 
} 

我想要做的就是填充一個列表框那是與在那個函數中接收到的消息的形式,但我不知道如何與來自MessageTransfer函數的特定形式進行通信

回答

5

我建議您的偵聽器不知道如何呈現消息。相反,暴露的形式可以聽一個事件:

// event args class for transmitting the message in the event 
public class MessageEventArgs : EventArgs 
{ 
    public IMessage Message { get; private set; } 

    public MessageEventArgs(IMessage message) 
    { 
     Message = message; 
    } 
} 

在監聽器類:

public class MyListener : IMessageListener 
{ 
    public event EventHandler<MessageEventArgs> MessageReceived; 

    public void MessageTransfer(IMessage m) 
    { 
     OnMessageReceived(new MessageEventArgs(m)); 
    } 

    protected void OnMessageReceived(MessageEventArgs e) 
    { 
     EventHandler<MessageEventArgs> temp = MessageReceived; 
     if (temp != null) 
     { 
      temp(this, e); 
     } 
    } 
} 

現在你可以在你的表單中添加一個事件偵聽器和消息信息添加到列表框或你喜歡的任何其他類型的控制。

更新
這是一個關於如何在窗體中連接事件處理程序的示例。此代碼兩個假設:

  • MessageReceivedIMessageListener接口
  • IMessage接口有一個名爲Text屬性定義的事件。

代碼示例:

public partial class MainUI : Form 
{ 
    private IMessageListener _messageListener; 

    public MainUI() 
    { 
     InitializeComponent(); 
     _messageListener = new MyListener(); 
     _messageListener.MessageReceived += MessageListener_MessageReceived; 
    } 

    void MessageListener_MessageReceived(object sender, MessageEventArgs e) 
    { 
     _messageListBox.Items.Add(e.Message.Text); 
    } 

} 
+0

thanx爲快速回復! 這可能聽起來很愚蠢..但是如何(以及在​​什麼情況下)在表單中添加事件偵聽器? (我的猜測是,我有編輯Form1.Designer.cs,並在Form1部分添加類似 this.onMessageReceived + =新System.EventHandler(this.Form1_DoStuffWithMessage) – 2010-05-17 08:00:31

+1

@andrew:見例如更新的答案。 – 2010-05-17 08:10:54

+0

謝謝,這有幫助,幾乎沒有伎倆,但我現在有另一個問題: 每當MessageListener_MessageReceived函數被調用我得到一個「System.InvalidOperationException:跨線程操作無效:控制'ticketList'從一個線程訪問而不是它創建的線程。「,ticketList是我的列表框 – 2010-05-17 13:37:56

1

如果您的形式持有聽衆最簡單的方法是創建一個事件偵聽器將上升爲正被轉移每條消息。

  1. 以下內容添加到您的監聽器類:

    public delegate void MessageHandler(IMessage m); 
    public event MessageHandler MessageReceived; 
    
  2. 以下內容添加到您的MessageTransfer方法:

    if (MessageReceived != null) 
         MessageReceived(m); 
    
  3. 現在,在您的表格,您可以附加一個方法爲剛剛創建的活動:

以下行應放置在形式初始化監聽器後:

_listener.MessageReceived += new MessageHandler(Form1_MessageReceived); 

下面的方法應該我放置在窗體本身:

void Form1_MessageReceived(IMessage m) 
    { 
     // add the message to the list 
    } 

有你需要一件事如果偵聽器在另一個線程上運行,那麼可以這樣做,並調用表單線程中的另一個方法來修改列表。