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 收到的消息?
-
将目标列表框定义为 NPF 类的属性:
public ListBox Target {get; set;}
-
在button1_Click方法中设置目标:
wssv.Target = myListBox;
-
收到消息后,将其添加到列表框中。但是,由于您与 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);
}