TextBox text “Replace” function does not work well

2019-08-31 22:51发布

问题:

I have already looked at similar questions here but it did not help.

I am using windows forms. I have button1 and textbox1.

I am trying to replace (or delete) the selected text in textBox1 and enter new letter (letter A) in place of it.

The code works well with random mixed numbers and letters for example:

385F1 select 8 and then result = 3A5F1 (8 replaced by A)

H74S31B select 4S and then the result is = H7A31B

KQ5689 select Q5689 and then the result is KA

So it works well, but when I select a number or a letter from a string which consists of same numbers or letters then it does not work, for example:

666777222333 select any 7 then the result = 666AAA222333 (not working)

9992244GG select any 9 then the result = AAA2244GG (not working)

QQQHHHUUU select any Q then the result = AAAHHHUUU (not working)

QQQHHHUUU select any QH then the result = QQAHHUUU(it works when different letters selected)

4433366 select 333 then the result = 44A66 (it works when all same numbers is selected)

Hope I explained it well. I don't know what causes this behavior. please help. Thank you

public partial class Form1 : Form
{
    int TxTindex;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        ActiveControl = textBox1;
        textBox1.Focus();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        textBox1.Focus();

        if (textBox1.SelectedText.Length > 0) // to check if any text selected
        {
            TxTindex = textBox1.SelectionStart; // save the caret position 

            textBox1.Text = textBox1.Text.Replace(textBox1.Text.Substring(textBox1.SelectionStart, textBox1.SelectionLength),"A");

            textBox1.SelectionStart = TxTindex + 1; // place the caret after the inserted string
        }
        else
        {
            return;
        }
    }
}

回答1:

Your problem is here :

textBox1.Text = textBox1.Text.Replace(textBox1.Text.Substring(textBox1.SelectionStart, textBox1.SelectionLength),"A");

The Substring function returns string. In your example (666777222333 select any 7 then the result = 666AAA222333 (not working)), it returns "7". But Text.Replace will replace all occurrences of 7. That is not what you want. What you can do is, instead of using string.Replace function, use string.Remove and string.Insert

textBox1.Text = textBox1.Text.Remove(textBox1.SelectionStart, textBox1.SelectionLength).Insert(textBox1.SelectionStart, "A");

But this might not be very efficient for large strings. A StringBuilder would be better.



回答2:

The problem is caused by the usage of string.Replace function.

What you are trying to accomplish can be done simply by

if (textBox1.SelectionLength > 0)
    textBox1.SelectedText = "A";

There is no need to save/set selection start.