Reputation: 1813
I want to prevent one particular character *
(asterisk) from being entered or pasted into a text box.
I tried:
key_press
event - but it does not handle the case when user pastes an asterisk to the text box.text_changed
event - but when I remove the character, the cursor position goes back to the beginning of the text.So I am wondering how to handle it, preferably in one event.
Upvotes: 1
Views: 5905
Reputation: 1813
Here is the solution i found:-
On Text_changed event, here is what i am doing:-
txt1.Text = txt1.Text.Replace("*", string.Empty);
txt1.Select(txt1.Text.Length, 0);
Updated code:- On Text_changed event:-
int curpos = 0;
bool isReplaced = false;
private void txt1_TextChanged(object sender, EventArgs e)
{
if (txt1.Text.Contains('*'))
{
curpos = txt1.SelectionStart;
isReplaced = true;
}
txt1.Text = txt1.Text.Replace("*", string.Empty);
if (isReplaced)
{
txt1.Select(curpos.Equals(0) ? 0 : curpos -1, 0);
isReplaced = false;
}
}
Final code and Tested :-
if (txt1.Text.Contains('*'))
{
foreach (char c in txt1.Text)
if (c.Equals('*'))
barredCharCount += 1;
curPosition = txt1.SelectionStart;
isTextReplaced = true;
}
txt1.Text = txt1.Text.Replace("*", string.Empty);
if (isTextReplaced)
{
txt1.Select(curPosition.Equals(0) ? 0 : curPosition - barredCharCount, 0);
isTextReplaced = false;
curPosition = barredCharCount = 0;
Console.Beep(); //does not work on 64 bit system
}
This piece of code is tested and working perfectly...
Upvotes: 0
Reputation: 550
You can set the cursor postion. For example:
textBox1.SelectionStart = textBox1.Text.Length;
EDIT:
Ok i took some time to write you a solution that works quite good. It keeps the edit cursor at the proper position and also covers the situation in which user pastes some * chars between chars.
int position = this.textBox1.SelectionStart;
string str = this.textBox1.Text;
int hit = 0;
for (int i = 0; i < position; i++)
{
if (str[i].Equals('*'))
hit++;
}
str = str.Replace("*", "");
this.textBox1.Text = str;
this.textBox1.SelectionLength = 0;
this.textBox1.SelectionStart = position - hit;
Upvotes: 0
Reputation: 12604
use the text changed event, but save the location of the cursor (the SelectionStart and SelectionEnd properties) before you remove the asterisk, then re set the cursor position (less the number of asterisks removed before the cursor).
private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
var currentText = textBox1.Text;
var selectionStart = textBox1.SelectionStart;
var selectionLength = textBox1.SelectionLength;
int nextAsterisk;
while ((nextAsterisk = currentText.IndexOf('*')) != -1)
{
if (nextAsterisk < selectionStart)
{
selectionStart--;
}
else if (nextAsterisk < selectionStart + selectionLength)
{
selectionLength--;
}
currentText = currentText.Remove(nextAsterisk, 1);
}
if (textBox1.Text != currentText)
{
textBox1.Text = currentText;
textBox1.SelectionStart = selectionStart;
textBox1.SelectionLength = selectionLength;
}
}
Upvotes: 6
Reputation: 4217
This question may be of use to you. What you're looking for seems like either a MaskedTextBox or a TextBox with custom Validation logic. You should not simply erase an asterisk characters when it is input, because if a user has selected text, then typed an asterisk, they will have replaced the selected text with an asterisk before you have the chance to remove it.
Upvotes: 2