如何将包含各种值的消息放在C#的单独文本框中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将包含各种值的消息放在C#的单独文本框中相关的知识,希望对你有一定的参考价值。

我收到了Arduino的消息字符串,现在我想拆分消息并将它们放在单独的框中。

消息是:

“DevID~第一个值| $ DevEUI~第二个值| $ HWEUI~第三个值| $ AppKey~第四个值|”

每个$标志后消息都会出现。代码如下,在运行时它会拆分消息,字符串“value”每次都获得新值,但是所有文本框在当前时间都包含相同的值。

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort Arduino = (SerialPort)sender;

    string indata = Arduino.ReadExisting();
    Debug.WriteLine("Data Received:");
    Debug.Print(indata);

    isConnected = true;
    RxString = RxString + indata;
    int endmarkerPos = RxString.IndexOf('|');
    if(endmarkerPos != -1)
    {
        //now pack everything till endmarker into messageString and delete this part from RxString
        messageString = RxString.Substring(0, RxString.IndexOf('|'));
        Debug.Print(messageString);
        RxString = RxString.Substring(endmarkerPos + 1);
    }

    int startmarkerPos = messageString.IndexOf('$');
    if (startmarkerPos != -1)
    {
        messageString  = messageString.Substring(startmarkerPos +1);
        String command = messageString.Substring(0, messageString.IndexOf('~'));
        String value = messageString.Substring(messageString.IndexOf('~') + 1);
        Debug.Print("---parsed: command: " + command + "	 value: " + value);
        Debug.Print("the trimmed message is: " + messageString);

        if (string.Compare(command , " DevID" ) == 1)
        {
            //messageString = messageString.Substring(messageString.IndexOf('~') + 1);

            textBox1.Invoke(new Action(() => textBox1.Text = value));
            //textBox1.Text = value;
            messageString = messageString.Substring(messageString.IndexOf('~') + 1);
            Debug.Print("1st block");
        }
        if (string.Compare(command, " DevEUI") == 1)
        {
            //messageString = messageString.Substring(messageString.IndexOf('~') + 1);

            textBox2.Invoke(new Action(() => textBox2.Text = value));
            //textBox1.Text = value;
            messageString = messageString.Substring(messageString.IndexOf('~') + 1);
            Debug.Print("2nd block");
        }
        if (string.Compare(command, " HWEUI") == 1)
        {
            //messageString = messageString.Substring(messageString.IndexOf('~') + 1);

            textBox2.Invoke(new Action(() => textBox3.Text = value));
            //textBox1.Text = value;
            messageString = messageString.Substring(messageString.IndexOf('~') + 1);
            Debug.Print("3rd block");
        }
        if (string.Compare(command, " AppKey") == 1)
        {
            //messageString = messageString.Substring(messageString.IndexOf('~') + 1);

            textBox2.Invoke(new Action(() => textBox4.Text = value));
            //textBox1.Text = value;
            messageString = messageString.Substring(messageString.IndexOf('~') + 1);
            Debug.Print("4th block");
        }
答案

IndexOf将返回角色第一次出现的索引。所以这就是为什么你总是得到相同的子串!

您应该使用String.Split将您的字符串拆分两次:

string [] values = meassageString.Split('|').Select(x=>x.Split('~').Last()).ToArray();

说明:

  • 第一个拆分返回由|管道字符分隔的不同部分。
  • 您从该数组中选择每个项目,然后通过~字符再次拆分每个项目。一个项目的拆分将产生一个小的2个子项目,你的价值将位于最后一个位置你需要采取的这个。

现在,您可以将不同的值分配到相应的文本框中:

textBox2.Invoke(new Action(() => textBox2.Text = values[1]));

在运行时它会拆分消息,字符串“value”每次都获得新值

这不是你的代码真正做的。到目前为止,您只执行一次操作。没有循环会重复子串过程。如果您使用调试器,您将看到它。据我所知,你将发布的字符串作为来自ReadExisting in string的整个消息。由于你只做了一次,command将只有它在这一行中获得的值:

String command = messageString.Substring(0, messageString.IndexOf('~'));

因为你之后不改变它只有1个if条件可以是真的!其余的几乎没用。

以上是关于如何将包含各种值的消息放在C#的单独文本框中的主要内容,如果未能解决你的问题,请参考以下文章

如何从输入框中显示 HTML

在MS访问中的子表单上显示查询结果

将最长字段放在dataframe列中

如何将多个数据库值返回到文本框?

如何将列表的内容放在单个MessageBox中?

窗口消息框中的 C# WPF XAML