C# - 将项添加到类窗体上的列表框

本文关键字:窗体 列表 添加 | 更新日期: 2023-09-27 18:30:57

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

Websocket-sharp Server

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);
        }
    }
}

现在我想知道,如何为已经打开的 Form1 上的列表框发送在 OnMessage 收到的消息?

C# - 将项添加到类窗体上的列表框

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

    public ListBox Target {get; set;}

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

    wssv.Target = myListBox;

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

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

更好的解决方案是在 c# 中使用绑定。

但是如果你想要一个快速的解决方案,你可以创建这个类:

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

在窗体 1 中声明

public static ListBox listBox;

最后

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