RichTextBox 分配新行但只显示最后一行

RichTextBox assigning new lines but only last line showing

我在 GUI 上使用正则表达式从 GCode 中提取位置 X 和 Y,并将其打印在 richTextBox 上。

private void button1_Click(object sender, EventArgs e)
        {
            TextReader read = new System.IO.StringReader(richTextBox1.Text);
            int rows = richTextBox1.Lines.Length;
            Console.WriteLine(rows);
            string[] text = new string[rows];
            for (int r = 0; r < rows; r++)
            {
                text[r] = read.ReadLine();
                if (text[r] != null)
                {
                    Match posX = Regex.Match(text[r], @"X([0-9\.]+)");
                    Match posY = Regex.Match(text[r], @"Y([0-9\.]+)");
                    GroupCollection posXGroup = posX.Groups;
                    GroupCollection posYGroup = posY.Groups;
                    Console.WriteLine(posXGroup[1] + "\t" + posYGroup[1] + "\n");
                    richTextBox2.Text = (posXGroup[1] + "\t" + posYGroup[1] + "\n"); 
                }
            }
        } 

我的 GCode:

N65 G2  X21.5091  Y15.5209  Z0.0000  I0.0277  J-0.7392 
N120 G2  X21.5280  Y18.0069  Z0.0000  I0.0255  J-0.7476
N210 G2  X21.5968  Y15.0534  Z0.0000  I-0.0483  J-1.2184
N230 G2  X21.6745  Y17.4894  Z0.0000  I0.0473  J-1.2560

我的问题是将结果打印到 richTextBox。它只打印最后一行的值:21.6745 17.4894 但不打印它上面 3 行的位置。虽然控制台打印成功。有人可以帮我解决这个问题吗?

快速修复是连接文本:

richTextBox2.Text += (posXGroup[1] + "\t" + posYGroup[1] + "\n"); 

更好的解决方案是永远不要使用字符串连接,因为这会在每个连接添加到堆时给 GC 带来压力。而是使用 StringBuilder:

    private void button1_Click(object sender, EventArgs e)
    {
        TextReader read = new System.IO.StringReader(richTextBox1.Text);
        int rows = richTextBox1.Lines.Length;
        Console.WriteLine(rows);
        string[] text = new string[rows];
        var sb = new StringBuilder();
        for (int r = 0; r < rows; r++)
        {
            text[r] = read.ReadLine();
            if (text[r] != null)
            {
                Match posX = Regex.Match(text[r], @"X([0-9\.]+)");
                Match posY = Regex.Match(text[r], @"Y([0-9\.]+)");
                GroupCollection posXGroup = posX.Groups;
                GroupCollection posYGroup = posY.Groups;
                Console.WriteLine(posXGroup[1] + "\t" + posYGroup[1] + "\n");
                sb.Append(posXGroup[1]);
                sb.Append("\t");
                sb.Append(posYGroup[1]);
                sb.Append("\n"); 
            }
        }
        richTextBox2.Text = sb.ToString();
    } 

要查看为什么会发生这种情况,请在行 richTextBox2.Text = 上放置一个断点,然后按 F10 单步执行代码,循环的每次迭代都会重置 richTextBox2.Text 的值。

您分配的太过分了。您需要通过连接附加文本来分配。文本是否有换行并不重要。赋值 = 会将变量设置为文本 属性。加法赋值运算符 += 将连接。