C# - 从类中添加项目到表单上的列表框

时间:2016-01-18 21:56:11

标签: c# class websocket listbox server

我正在尝试在C#中创建一个简单的WebSocket服务器,它将在JavaScript中与客户端通信,我正在测试的代码是:

Websocket-sharp服务器

using System;
using System.Windows.Forms;
using WebSocketSharp;
using WebSocketSharp.Server;

namespace MyProgram
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var wssv = new WebSocketServer(8081);

            wssv.WaitTime = TimeSpan.FromSeconds(3);

            wssv.AddWebSocketService<NFP>("/");

            wssv.Start();
        }
    }

    public class NFP : WebSocketBehavior
    {
        protected override void OnMessage(MessageEventArgs e)
        {
            Console.WriteLine(e.Data);

            Send("Received");
        }

        protected override void OnError(ErrorEventArgs e)
        {
            //Console.WriteLine(e.Exception);
        }

        protected override void OnClose(CloseEventArgs e)
        {
            //Console.WriteLine(e.Code);
        }
    }
}

现在我想知道,如何在FormM1上已经打开的ListBox上发送OnMessage收到的消息?

2 个答案:

答案 0 :(得分:1)

  1. 将目标列表框定义为NPF类的属性:

    public ListBox Target {get; set;}

  2. 在button1_Click方法中设置目标:

    wssv.Target = myListBox;

  3. 收到邮件后,将其添加到列表框中。但是,由于您位于与UI线程不同的线程(这是唯一可以修改表单上的控件的线程),您必须调用Invoke上的Target成员来完成您的工作:

    protected override void OnMessage(MessageEventArgs e)
    {
        Console.WriteLine(e.Data);
    
        if (Target != null)
            Target.Invoke( () => {Target.Items.Add(e.Message);});
    
        Send("Received");
    }
    

答案 1 :(得分:0)

更好的解决方案是在c#中使用Binding

但如果您想要快速解决方案,可以创建此类:

public static class ListBoxAdder
{
    public static void Add(ListBox listbox, string newItem)
    {
        listbox.Items.Add(newItem);
    }
}
Form1中的

声明

public static ListBox listBox;

最后

protected override void OnMessage(MessageEventArgs e)
{
  ListBoxAdder.Add(Form1.listBox, e.Data);
}