如何在用户输入文本框时替换文本框中的字符? (在c#中)

时间:2012-02-25 07:11:18

标签: c# winforms visual-studio-2010 textbox

好的,我发生的是一个文本框,根据从列表框中选择的内容填充了一些文本。

说文本框看起来像这样:

blah blah ??? as?f
每当用户点击文本框并删除“?”时,我需要弄清楚该怎么做字符,我想用*替换该字符,然后每当他们尝试删除*时,它将被替换为“?” ,以便最终结果看起来像

blah blah **? as*f

如果他们删除除了一个“?”之外的所有内容。

无论我在网上搜索了多长时间,我似乎都找不到类似的东西......我发现的最接近的是这个问题 - Determine when and which character is added or deleted in a Text Box

但这对我正在尝试做的事情并没有什么帮助..如果有人知道从哪里开始寻找甚至怎么做,我会非常感激!

提前感谢!

编辑:是的,这是针对Windows窗体应用程序的,抱歉,我忘了指定它。 O.o

2 个答案:

答案 0 :(得分:4)

您可以处理KeyDown事件并绕过默认处理。事件处理程序可能如下所示:

public void OnKeyDown(Object sender, KeyEventArgs e)
{
   char[] text = textBox.Text.ToCharArray();
   int pos = textBox.SelectionStart;

   switch (e.KeyCode)
   {
       case Keys.Back: if (pos == 0) return; pos --; break;
       case Keys.Delete: if (pos == text.Length) return; break;
       default: return;
   }

   switch (text[pos])
   {
       case '?': text[pos] = '*'; break;
       case '*': text[pos] = '?'; break;
       default: return;
   }
   textBox.Text = new String(text);
   e.Handled = true;
}

如果需要,您可能还需要添加对修改键的检查,调整光标位置以及在选择文本时实现自定义行为。

答案 1 :(得分:2)

将textbox.Text存储在某个字符串中,在每次按键(textbox.KeyPress)之后,通过将保存的字符串与文本框中的文本进行比较,找出“?”已被删除,如果它是在正确位置的文本框文本中插入'*'。

//get indexes of all '?'
list<int> charlist = new list<int>();
string buff = textbox.Text;
for(int c = 0; c< buff.length, c++)
{
    if (buff[c] == '?')
    {
        charlist.add(c)
    }
}
//inside keypress event
foreach(int c in charlist)
{
    if (textbox.Text[c] != '?')
    {
        textbox.Text = textbox.Text.Insert(c, "*");
    }
}