C# 如何正确追加文本以替换部分原始文本

C# 如何正确追加文本以替换部分原始文本,c#,winforms,C#,Winforms,我在将文本插入文本框时遇到问题。实际上,我试图做的是从“richTextBox1”复制一段文本,对其进行处理,然后将处理后的数据插入到“richTextbox2”中(上面的“richTextbox2”中已经有文本。处理后的文本应该放在下面) 我的问题是,每次我点击一个按钮来处理而不是替换文本,它只会添加另一个文本块。我不知道如何替换它而不是添加它 例如,我的richTextbox2一开始看起来像这样: “你好”,我叫布鲁斯 我点击btnVowels,它看起来像这样: 你好,我叫布鲁斯 “Hl

我在将文本插入文本框时遇到问题。实际上,我试图做的是从“richTextBox1”复制一段文本,对其进行处理,然后将处理后的数据插入到“richTextbox2”中(上面的“richTextbox2”中已经有文本。处理后的文本应该放在下面)

我的问题是,每次我点击一个按钮来处理而不是替换文本,它只会添加另一个文本块。我不知道如何替换它而不是添加它

例如,我的richTextbox2一开始看起来像这样:

“你好”,我叫布鲁斯


我点击btnVowels,它看起来像这样:

你好,我叫布鲁斯


“Hll”,我的nm s Brc

上面说的很好,但问题是现在若我点击btnAlpha,它会显示以下内容:

你好,我叫布鲁斯


“Hll”,我的nm s Brc你好,我叫布鲁斯

我想让它走:

“你好”,我叫布鲁斯


你好,我叫布鲁斯

有人有什么想法吗

/* already at start of richTextBox2 when clicking on a different button:

string nl = System.Environment.NewLine;
string copyText = richTextBox1.Text;
richTextBox2.Text = copyText;

richTextBox2.AppendText(lineBreak + "----------------------" + lineBreak);

*/


private void btnVowels_Click(object sender, EventArgs e)
{
    string copyText = richTextBox1.Text;
    string vowels = "AaEeIiOoUu";
    copyText = new string(copyText.Where(c => !vowels.Contains(c)).ToArray());

    richTextBox2.AppendText(copyText);
}

private void btnAlpha_Click(object sender, EventArgs e)
{
    string copyText = richTextBox1.Text;
    string nonAlpha = @"[^A-Za-z ]+";
    string addSpace = "";
    copyText = Regex.Replace(copyText, nonAlpha, addSpace);

    richTextBox2.AppendText(copyText);
}
更新:

仍然没有让它工作,我已经设置了一个名为divider的字符串,它是----------行,并尝试看看我是否可以选择它,然后粘贴,但没有运气,因为在我单击按钮后,它在调试器中无法识别copyText:

 private void btnVowels_Click(object sender, EventArgs e)
    {


 int startingIndex = richTextBox2.Find(divider);
 string copyText = richTextBox1.Text;
 string vowels = "AaEeIiOoUu";
 copyText = new string(copyText.Where(c => !vowels.Contains(c)).ToArray());
 richTextBox2.Select(startingIndex, divider.Length);

 richTextBox2.SelectedText = copyText;

    }

AppendText
只会将文本追加到末尾,这不是您想要的。相反,您必须找到要替换的文本并将其选中。一旦选中,您可以覆盖它

这是一个完整的示例。表单将其RichTextBox设置为

“你好”,我叫布鲁斯

然后,当单击按钮时,它将用
Hi
替换
“Hello”

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

    private void button1_Click(object sender, EventArgs e)
    {
        // Get the starting index for the content we want to replace.
        int startingIndex = richTextBox1.Find("\"Hello\"");

        // Select the content to be replaced.
        richTextBox1.Select(startingIndex, "\"Hello\"".Length);

        // Replace the content.
        richTextBox1.SelectedText = "Hi";
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        richTextBox1.Text = "\"Hello\", my name is Bruce";
    }
}
编辑 此更新向您展示了如何找到分隔符行,获取下一行第一个字符的索引,然后选择文本的其余部分。然后我们可以替换它

private void btnVowels_Click(object sender, EventArgs e)
{
    string copyText = this.RemoveVowelsFromString(richTextBox1.Text);  
    richTextBox2.AppendText(copyText);
}

private void btnAlpha_Click(object sender, EventArgs e)
{
    string copyText = richTextBox1.Text;
    string nonAlpha = @"[^A-Za-z ]+";
    string addSpace = "";
    copyText = Regex.Replace(copyText, nonAlpha, addSpace);

    // Replace the content beneath the divider
    string divider = "------------";

    // Find the first char index of the divider line
    int dividerIndex = richTextBox2.Find(divider);

    // grab the line number that the divider is on
    int dividerLine = richTextBox2.GetLineFromCharIndex(dividerIndex);

    // get the first char on the line following the divider
    int startingIndex = richTextBox2.GetFirstCharIndexFromLine(dividerLine+1);

    // Select everything starting after the divider to be replaced.
    richTextBox2.Select(startingIndex, richTextBox2.Text.Length - startingIndex);

    // Replace the content.
    richTextBox1.SelectedText = copyText;
}

private string RemoveVowelsFromString(string content)
{
    string vowels = "AaEeIiOoUu";
    copyText = new string(copyText.Where(c => !vowels.Contains(c)).ToArray());

    return copyText;
}

似乎不需要复制原始字符串

string nonAlpha = @"[^A-Za-z ]+";
string addSpace = "";
richTextBox1.Text = Regex.Replace(richTextBox1.Text, nonAlpha, addSpace);

这是WinForms还是WPF?为什么不richTextBox2.Text=copyText;而不是AppendText?@JohnathonSullinger Windows窗体应用程序如何在不知道添加标记的情况下到达1k rep?他指的是在Stackoverflow问题中添加WinForms标记。这是WinForms特有的,不一定是C#。我认为他不想替换文本框的所有内容。相反,他只想替换文本框中的适用内容。乔纳森所说的,只有适用内容(下面的内容).我在顶部将其称为未处理的内容,在底部将其称为已处理的内容,只有已处理的文本可以替换,未处理的文本不会被触碰。那么为什么不只设置两个文本框呢?规范规定,它必须是未处理的数据,后跟------------------然后再后跟下面已处理的数据。所有这些都必须在一个pla中谢谢,有一个小问题我想不出来,然后我就不打扰你了,这一行:
richTextBox2.Select(startingIndex,richTextBox2.Length-startingIndex)
Length下面有一条摆动的线,因为它无法处理该方法,finds.TextLength但当我运行程序时,它会与该行代码相匹配。对不起,这就是我在手机上做示例的结果。你需要做
richTextBox.Text.Length-startingIndex
。我会更新我的答案以匹配它。我以前也尝试过这一点ut no give,不断出现:System.Windows.Forms.dll中发生“System.ArgumentOutOfRangeException”类型的未处理异常。其他信息:InvalidArgument=Value'-1'对“start”无效。-1表示找不到您正在查找的行。请查看上的MSDN文档,是否有替代方法我可以在哪里创建一个空对象并将更改放在那里?那么如果我创建了
richTextBox2.AppendText(“帮助”+分隔符+块);
是否有一种方法可以将块全局设置为一个对象,并且对于单击的每个按钮,只替换该块中的文本?