我想阻止将一个特定字符*
(星号)输入或粘贴到文本框中。
我试过了:
key_press
事件 - 但是当用户将星号粘贴到文本框时它不会处理。text_changed
事件 - 但是当我删除字符时,光标位置会回到文本的开头。所以我想知道如何处理它,最好是在一个事件中。
答案 0 :(得分:6)
使用文本更改事件,但在删除星号之前保存光标的位置(SelectionStart和SelectionEnd属性),然后重新设置光标位置(减去光标前删除的星号数)。
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;
}
}
答案 1 :(得分:2)
This question可能对您有用。您正在寻找的似乎是MaskedTextBox或具有自定义验证逻辑的TextBox。您不应该在输入时简单地删除星号字符,因为如果用户选择了文本,然后键入星号,他们将在您有机会删除它之前用星号替换所选文本。
答案 2 :(得分:0)
您可以设置光标位置。例如:
textBox1.SelectionStart = textBox1.Text.Length;
修改强>
好的,我花了一些时间给你写一个非常好的解决方案。它将编辑光标保持在正确的位置,并且还涵盖用户在字符之间粘贴一些*字符的情况。
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;
答案 3 :(得分:0)
以下是我找到的解决方案: -
在Text_changed事件中,我正在做的是: -
txt1.Text = txt1.Text.Replace("*", string.Empty);
txt1.Select(txt1.Text.Length, 0);
更新了代码: - 在Text_changed事件: -
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;
}
}
最终代码和经过测试: -
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
}
这段代码经过测试并且工作正常......