【问题标题】:Unable to see string in rich text box在富文本框中看不到字符串
【发布时间】:2019-12-31 05:01:19
【问题描述】:

我正在处理c# winforms。我的main form 中有一个rich textbox。现在我正在使用一个类HandleClient,其中我正在使用一个我正在调用函数的线程。在那个函数中,我创建了一个主窗体的新对象。我的代码如下

流程

首先,我通过用户传递一个端口号,然后单击按钮,我将监听它。为此,我有一个名为Server的类

主窗体

port = Convert.ToInt32(tbPort.Text);
Server server = new Server(port);
if (btnListen.Text == "Listen")
{
     btnListen.Text = "Close";
     server.start();
}

上面的对象被创建并调用了start方法

服务器类

public Server(int port)
{
   this.port = port;
}

 public void start()
 {
        listner = new TcpListener(new IPEndPoint(IPAddress.Any, port));
        listner.Start();
        listnerthread = new Thread(new ThreadStart(Listner));
        listnerthread.Start();
 }

public void Listner()
{
        while (true)
        {
            try
            {

                TcpClient C = listner.AcceptTcpClient();
                HandleClient client = new HandleClient();
                client.startClient(C);

            }
            catch (Exception ex)
            {
                Console.WriteLine("Error in listner");
                Console.WriteLine(ex.Message);
            }
        }
}

上面的方法是监听端口。此外,我的句柄客户端函数也被调用。我正在尝试将传入的字符串显示到富文本框

处理客户

 // Buffer to store the response bytes.
byte[] data = new byte[9999];

Thread comThread;
public void startClient(TcpClient inClientSocket)
{
   this.clientsocket = inClientSocket;
   comThread = new Thread(doChat);
   comThread.Start();
}

private void doChat()
{
        MainForm form = new MainForm();

        while ((true))
        {
            try
            {
                // Read the first batch of the TcpServer response bytes.
                NetworkStream stream = clientsocket.GetStream();
                stream.ReadTimeout = 1000;
                int bytes = stream.Read(data, 0, data.Length);                 

                responseData = BitConverter.ToString(data,0,bytes); 
                form.rtBRecievedData.Text = responseData;

                stream.Close();
                clientsocket.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine(" >> " + ex.ToString());
                comThread.Abort();
            }
        }
}

responseData 的值为01-01-01-01-00-01-00-19-F4-09-10-00-00-00-00-30-30-32-39-39-38-30-30-35-35-36-31-00-01-00-01-00-01-00-15-AA-10-00-00-00-00-30-30-32-39-39-38-30-30-35-35-36-31-12-00-12

现在的主要问题是这个字符串没有显示在rich text box 上。我可能遗漏了一些我无法理解的东西。

任何帮助将不胜感激。

【问题讨论】:

  • 你在哪里展示过表格?
  • @RonBeyer 我正在使用表单发送端口号,然后接收该端口上的数据
  • 请检查“BitConverter.ToString(data,0,bytes)”是否返回字符串值。它可以返回一个空白。
  • @Nurhan 是的,它返回一个字符串
  • @Faisal 你何时何地调用表单的 Show() 方法?

标签: c# winforms richtextbox


【解决方案1】:

您的问题是您试图在MainForm 的新实例上显示TextBox 中的信息(您从未调用过 Show()),而不是现有的MainForm,其中用户已进入港口。要解决此问题,您的 HandleClient 类需要对现有表单的引用。 将字段添加到 Server 和 HandleClient 类并相应地调整构造函数:

public Server(int port, Form mainForm)
{
    this.port = port;
    this.mainForm = mainForm;
}

public HandleClient (Form mainForm)
{
    this.mainForm = mainForm;
}

现在在创建Server 时,您使用this 关键字传递对当前表单的引用,从而传递给HandleClient。

最后,您删除创建新 MainForm 的行并改用该字段。

【讨论】:

  • 我已经尝试过你的方法,但它给了我一个例外 Object reference not set to an instance of an object 和 this.mainForm 是 null
  • 我已经完成了以下public MainForm mainForm { get; set; } 然后Server server = new Server(port, this.mainForm); 在server.cs 里面我声明了public int port { get; set; } public MainForm mainForm { get; set; } 之后我已经完成了public Server(int port, MainForm mainForm) { this.port = port; this.mainForm = mainForm; }
  • 在我的server.cs监听器里面,我做了以下HandleClient client = new HandleClient(this.mainForm);
  • 现在在我的HandleClient.cs 中,我已经声明了public MainForm mainForm { get; set; },然后是public HandleClient(MainForm mainForm) { this.mainForm = mainForm; }
  • 最后,在我的doChat() 方法中,我在这行之后完成了mainForm.rtBRecievedData.Text = responseData;,我得到了异常
【解决方案2】:
form.rtBRecievedData.Text = responseData; 

在一个循环中。 但是没有 Thread.Sleep() 方法。

form.rtBRecievedData.Text 可以在下一轮循环执行中替换为空字符串 responseData。

使用下面的代码,

form.rtBRecievedData.Text += responseData; 

解决问题。 最好在循环内休眠以延迟读取端口。

【讨论】:

  • 您是否将 form.rtBRecievedData.Text += responseData; 中的 = 改为 += ?
  • 是否有任何错误、异常或只是不显示文本?请调试并检查赋值是否正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-07
  • 2011-05-06
  • 2010-10-30
相关资源
最近更新 更多