如何更新richtextbox中的特定文本行,然后在每次按下空格键时对其进行排序?

哇哇

会员
已加入
2019年11月9日
留言内容
16
编程经验
Beginner
因此,这是另一项练习的一部分,而教授只是为我随机提出了​​这部分内容(其他人则有不同的想法,而更容易的是...)。我需要做的是,当他在richtextbox的最后一行中输入多余的数字(按降序排列的数字),然后每当我按"Spacebar"这些数字应该排序。例如:20 14 12 2(我输入:14),所以最后一行变为"20 14 14 12 2"等等。我做了"Spacebar press event",但是问题是如何更新文本的最后一行并将他键入的数字添加到字符串中(我已经使作业失败了,因为我无法在上课时编写程序。这纯粹是为了自学) 。
C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string descendingNums = string.Empty;

        // private kint. struct
        struct trecDalis
        {
            private string line2;
            private string line3;
            private string line4;

            public void priskLine(string aLine2, string aLine3, string aLine4)
            {
                line2 = aLine2;
                line3 = aLine3;
                line4 = aLine4;
            }

            public void print(RichTextBox rch)
            {
                rch.Text += '\n' + line2 +
                    '\n' + line3 +
                    '\n' + line4 + '\n';
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string file = System.IO.Directory.GetCurrentDirectory() + @"\duom.txt";
            string data;
            if (File.Exists(file))
            {
                label1.Text = "Failas yra";
                data = File.ReadAllText(file);
                string[] lines = data.Split('\n');

                // skaiciai didejimo tvarka
                int[] ascending = lines[0].Split(' ').Select(int.Parse).ToArray();
                数组.Sort(ascending);
                richTextBox1.Text += "---Skaičiai didėjimo tvarka---" + '\n';
                for (int i = 0; i < ascending.Length; i++)
                {
                    richTextBox1.Text += Convert.ToString(ascending[i]) + " ";
                }
                //--------------------------------

                // priskiriama struct
                trecDalis uzd = new trecDalis();
                uzd.priskLine(lines[1], lines[2],lines[3]);
                richTextBox1.Text += '\n' + "---Private kintamieji struct---";
                uzd.print(richTextBox1);
                //--------------------------------

                // balsiai
                string str = lines[4] + lines[5] + lines[6];
                int bA = 0, bE = 0, bI = 0, bO = 0, bU = 0;
                char[] arr = str.ToArray();
                for (int i = 0; i < str.Length; i++)
                {
                    if (arr[i] == 'a')
                    {
                        bA++;
                    }
                    else if (arr[i] == 'e')
                    {
                        bE++;
                    }
                    else if (arr[i] == 'i')
                    {
                        bI++;
                    }
                    else if (arr[i] == 'o')
                    {
                        bO++;
                    }
                    else if (arr[i] == 'u')
                    {
                        bU++;
                    }
                }
                richTextBox1.Text += "---Balsiai---" + '\n';
                richTextBox1.Text += "A=" + Convert.ToString(bA) + '\n';
                richTextBox1.Text += "E=" + Convert.ToString(bE) + '\n';
                richTextBox1.Text += "I=" + Convert.ToString(bI) + '\n';
                richTextBox1.Text += "O=" + Convert.ToString(bO) + '\n';
                richTextBox1.Text += "U=" + Convert.ToString(bU);
                // --------------------------------------------

                // skaiciai maziejimo tvarka

                string numDesc = lines[7] + lines[8] + lines[9];
                int[] descending = numDesc.Split(' ', '\n', '\r').Select(int.Parse).ToArray();
                数组.Sort(descending);
                数组.Reverse(descending);
                richTextBox1.Text += '\n';
                richTextBox1.Text += "---Skaičiai mažėjimo tvarka---" + '\n';
                for (int i = 0; i < descending.Length; i++)
                {
                    richTextBox1.Text += Convert.ToString(descending[i]) + " ";
                }


                descendingNums = string.Join("", descending);

            }
            else
            {
                label1.Text = "Failo nėra";
            }
        }

        private void Space_Pressed(object sender, KeyPressEventArgs e)
        {
            if(e.KeyChar == (char)Keys.Space)
            {
                string[] lines = richTextBox1.Lines;
                lines[13] = richTextBox1.Text;
                richTextBox1.Lines = lines;
                richTextBox1.Text += descendingNums;
            }
        }
    }
}

问题是,当我尝试更新最后一行时,它仅复制所有内容...是否可以用我设置的方式来做到这一点?

表单如下所示:
捕获.png


数据应包括在内。
 

附件

  • duom.txt
    354 bytes · 观看次数: 5

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
看来很有趣:
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SimpleCSWinForms
{
    class Program : Form
    {
        Program()
        {
            var rtb = new RichTextBox()
            {
                Dock = DockStyle.Fill
            };

            rtb.KeyUp += (o, e) =>
            {
                if (e.KeyCode == Keys.Space)
                {
                    var lines = rtb.Lines;
                    var lastLine = lines.Length - 1;
                    lines[lastLine] = lines[lastLine]
                                        .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                                        .Select(s => Int32.TryParse(s, out int n) ? n : n)
                                        .OrderByDescending(n => n)
                                        .Aggregate("", (acc, n) => acc += n + ' ');
                    rtb.Lines = lines;
                    rtb.Select(rtb.TextLength, 0);
                }
            };

            Controls.Add(rtb);
        }

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Program());
        }
    }
}

当然,上面的代码更加复杂,因为它现在包括使用LINQ来:
  1. 将最后一行解析为以空格分隔的标记。
  2. 将每个令牌解析为整数。
  3. 将整数按降序排序。
  4. 用数字后跟空格重建字符串。
如果教师只是复制并粘贴了上面的代码而没有任何说明,则教师可能再次使学生失败。

我建议使用建议的方法 @谢平 上面是用他提到的类和方法一步一步地做事。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+
提供我给您提供了文档,其中提供了示例代码,用于示例目的,包括有关如何使用它的描述性信息。还是您认为我只是出于娱乐目的而提供了这些链接?嗯
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
With the RichTextBox to append 文本 you simply append to the Text property like you were doing in your original post. 什么 do you think you were doing in all your lines of code where you had richTextBox.Text += ...?

The more interesting problem is how to replace existing 文本. The standard approach is to set the selection using the Select() method to select the 文本 that you wish to replace, 和 then set the SelectedText property with the new 文本 you want to display.

The non-standard approach is to completely replace the Text or Lines properties with the new values you want to display. That's the approach I took in my code in post #3. I copied the existing lines on line #22. I figured out the last line on line #23. On lines 24-28, I replaced the 文本 for the last line with the sorted numbers. Then finally on line #29, I replace the lines that are in the RichTextBox.
 

哇哇

会员
已加入
2019年11月9日
留言内容
16
编程经验
Beginner
提供我给您提供了文档,其中提供了示例代码,用于示例目的,包括有关如何使用它的描述性信息。还是您认为我只是出于娱乐目的而提供了这些链接?嗯
C#:
        private void Space_Pressed(object sender, KeyPressEventArgs e)
        {
            if(e.KeyChar == (char)Keys.Space)
            {
                string newNums;
                newRTB = richTextBox1.Text;
                清单<string> diff;
                IEnumerable<string> oldStr = oldRTB.Split(' ', '\n').Distinct();
                IEnumerable<string> newStr = newRTB.Split(' ', '\n').Distinct();
                diff = newStr.Except(oldStr).ToList();
                foreach(object o in diff)
                {
                    sb.Append(" " + o);
                    oldRTB = sb2.Append(" " + o).ToString();
                }
                diff.Clear();

                string[] lines = richTextBox1.Lines;
                lines[13] = string.Empty;
                richTextBox1.Lines = lines;

                newNums = sb.ToString();
                int[] descending2 = newNums.Split(' ').Select(int.Parse).ToArray();
                数组.Sort(descending2);
                数组.Reverse(descending2);
                for (int i = 0; i < descending2.Length; i++)
                {
                    richTextBox1.Text += Convert.ToString(descending2[i]) + " ";
                }


            }
        }
好吧,我这样做了……出于某种原因,这感觉不对。它有效,但是由于某种原因,当我键入"100"该数字将被完全忽略并且不会打印,但是"101"等等...有什么想法吗?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
您使事情变得过于复杂。为什么需要新旧RichTextBoxes?
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+
但是您不需要这样做。您只需要按照我首先概述的方法进行操作即可。您已经使它过于复杂了,在您完成了将文本输出到RTB的方式的更新之前,不应将RTB用于任何用途。如果您不打算有效地使用StringBuilder,则最好将其装箱。
 

哇哇

会员
已加入
2019年11月9日
留言内容
16
编程经验
Beginner
但是您不需要这样做。您只需要按照我首先概述的方法进行操作即可。您已经使它过于复杂了,在您完成了将文本输出到RTB的方式的更新之前,不应将RTB用于任何用途。如果您不打算有效地使用StringBuilder,则最好将其装箱。
好吧,我真的不知道如何使用StringBuilder,因为我以前从未使用过,尤其是在这种情况下
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,925
地点
英国
编程经验
10+

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,500
地点
弗吉尼亚州切萨皮克
编程经验
10+
我正在将当前的RTB(oldRTB)与new(无论它们输入)进行比较,然后采用新值并将其附加为字符串。
但是,无需将先前的文本与新的文本进行比较。

上面的分配描述说,只有在按下空格键时才需要对最后一行进行排序。因此,这意味着您始终可以选择最后一行,读取在那找到的数字,对数字进行排序,然后替换最后一行。无需尝试进行插入排序,方法是先找出要在最后一行键入的新数字,然后再尝试将该数字插入已排序的数组中。只需收拾一切,然后对所有数字重新排序。
 
最佳 底部