【问题标题】:RichTextBox assigning new lines but only last line showingRichTextBox 分配新行但仅显示最后一行
【发布时间】:2020-07-17 02:48:26
【问题描述】:

我正在 GUI 上使用 Regex 从 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 行中的位置。虽然控制台打印成功。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: c# .net concatenation variable-assignment richtextbox


    【解决方案1】:

    快速解决方法是连接文本:

    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 的值。

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

    【讨论】:

    • 哇!十分感谢!在您的快速修复中,为什么我们必须输入+=?我以为它会自动创建一个新行,因为我已经有了"\n"。
    • 查看答案的左侧有一个全息复选框,检查并标记答案会给你一些代表点,让每个人都知道你的问题已经解决。祝你好运!
    • 我明白了。非常感谢!
    • I thought it automatically create a new line because I have had "\n" already. No. = 表示assign(即丢弃旧内容)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2017-06-30
    相关资源
    最近更新 更多