[英]C# - Add Item to Listbox on Form from a Class
我正在尝试用C#做一个简单的WebSocket服务器,它将与JavaScript中的客户端通信,我正在测试的代码是这样的:
Websocket锋利服务器
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上打开的ListBox在OnMessage上收到的消息?
将目标列表框定义为NPF类的属性:
public ListBox Target {get; set;}
在您的button1_Click方法中设置目标:
wssv.Target = myListBox;
收到消息后,将其添加到列表框中。 但是,由于您与UI线程不在同一线程中(这是唯一可以修改Form上的控件的线程),因此您必须在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#中使用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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.