Rushabh Shah
Rushabh Shah

Reputation: 287

Delete Selected Text from Textbox and Enter New Char in C#.NET

I am trying to delete selected text from textbox and enter new character in place of it. For example, if textbox consists of 123456 and I select 345, and press r on the keyboard, it should replace the selected text.

here is my code:

string _selectText = txtCal.SelectedText;
string _text = Convert.ToString(btn.Text);

if (_selectText.Length > 0) {
   int SelectionLenght = txtCal.SelectionLength;
   string SelectText = txtCal.Text.Substring(txtCal.SelectionStart, SelectionLenght);
   txtCal.Text = ReplaceMethod(SelectText, _text);
}

//replace method function
public string ReplaceMethod(string replaceString, string replaceText) {
   string newText = txtCal.Text.Replace(replaceString, replaceText);
   return newText;
}

Can anyone show me where my mistake is?

Upvotes: 6

Views: 9931

Answers (4)

Nicholas Miller
Nicholas Miller

Reputation: 4410

This is essentially the same as other answers, but formatted differently using C# 6.0.

// If there is selected text, it will be removed before inserting new text.
// If there is no selected text, the new text is inserted at the caret index.
string before = textBox.Text.Substring(0, textBox.SelectionStart);
string after = textBox.Text.Substring(textBox.SelectionStart + textBox.SelectedText.Length);

textBox.Text = $"{before}{insertText}{after}";
textBox.CaretIndex = $"{before}{insertText}".Length;

Note that I set the CaretIndex to a new position after changing the text. This may be useful since the caret index resets to zero when changing the text like this. You may also want to focus the textbox to draw the user's attention to the change and allow them to know where the caret currently is.

Upvotes: 1

John Kline Kurtz
John Kline Kurtz

Reputation: 855

The following does what you want and then selects the replacing text :)

    string _text = Convert.ToString(btn.Text);
    int iSelectionStart = txtCal.SelectionStart;
    string sBefore = txtCal.Text.Substring(0, iSelectionStart);
    string sAfter = txtCal.Text.Substring(iSelectionStart + txtCal.SelectionLength);
    txtCal.Text = sBefore + _text + sAfter;
    txtCal.SelectionStart = iSelectionStart;
    txtCal.SelectionLength = _text.Length;

Upvotes: 2

Matt Burnell
Matt Burnell

Reputation: 2796

The replace-based answer offered above may well replace the wrong instance of the selection, as noted in the comments. The following works off positions instead, and doesn't suffer that problem:

textbox1.Text = textbox1.Text.Substring(0, textbox1.SelectionStart) + textbox1.Text.Substring(textbox1.SelectionStart + textbox1.SelectionLength, textbox1.Text.Length - (textbox1.SelectionStart + textbox1.SelectedText.Length));

Upvotes: 10

Kundan Singh Chouhan
Kundan Singh Chouhan

Reputation: 14302

Try this instead

if (textbox1.SelectedText.Length > 0)
{
   textbox1.Text = textbox1.Text.Replace(text1.Text.Substring(textbox1.SelectionStart, textbox1.SelectionLength), btn.Text);                
}

Upvotes: 1

Related Questions