如何使TextBox不断更新用户的输入?

时间:2015-03-01 13:40:02

标签: c# .net winforms validation

我的表单中有TextBox,用户应该在那里输入一些字符串。

每2个字符后,应自动在其中添加"|"。但我不知道该怎么做。这是我的代码:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    string input = textBox1.Text; int count = 0;
    foreach (char c in input)
    {
        count++;
        if (count == 2)
        {
            input += '|';
            count = 0;
            textBox1.Text = input;
        }
    }
}
  • 用户只应输入十六进制字符(表示0-9,a-f)。

我已在e.Keychar事件中尝试了Keypress,但如果用户使用Copy-PasteCtrl-CCtrl-V,则无效{1}}。

4 个答案:

答案 0 :(得分:1)

如果你真的不需要,你不应该处理TextChanged事件,但你应该依赖MaskedTextBox,这是为了这个目的而建立的。

你可以找到一个很好的演练here on MSDN

基本上你应该设置Mask属性。您甚至可以使用sort of regular expressions as a mask来确保只键入您允许的值。


'操作方法':

创建MaskedTextBox控件并将模板设置为&&\|&&\|&&\|&&\|&&('&'表示任意ASCII字符,根据需要重复\|&&)。然后创建一个TextChanged事件并将事件处理程序设置为:

void maskedTextBox1_TextChanged(object sender, System.EventArgs e)
{
    string input = this.maskedTextBox1.Text;

    StringBuilder outputBuilder = new StringBuilder(input.Length);
    char[] allowedCharacters = new char[] { '|', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    foreach (char c in input)
    {
        if (allowedCharacters.Contains(c))
        {
            outputBuilder.Append(c);
        }
    }

    string output = outputBuilder.ToString();
    if (!input.Equals(output))
    {
        this.maskedTextBox1.Text = output;
    }
}

答案 1 :(得分:0)

第一个问题算法解决方案

检查索引是否均匀且> 0并将字符向左移动以为'|'腾出空间字符。

for (int i=0; i<input.length; i++)
{
    var c = input[i];

    if (i % 2 == 0 && i>0)
    {

        for(int j=input.length-1; j>=i; j++) input[j+1] = input[j];
        input[i] = '|';
        textBox1.Text = input;
    }
}

确保输入中有足够的空间(如果是原始类型集合)

答案 2 :(得分:0)

您当前代码的一个问题是,即使您以编程方式更新textBox,文本也会触发事件触发。避免这种情况的一种方法是检测文本更改何时由您引起。在下面的示例中,我通过检查是否“|”来完成此操作在字符串末尾2个字符以内。

使用StringBuilder逐步构建字符串以避免生成多个String对象。

如果您真的想要进行优化,那么mod操作可以替换为提取最低有效位的掩码。

  private void textBox1_TextChanged(object sender, EventArgs e)
  {
     string input = textBox1.Text;
     // did I cause this event to fire? if not, parse the input
     if (input.LastIndexOf("|") < input.Length - 2)
     {
        input = input.Replace("|", "");
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < input.Length; i++)
        {
           stringBuilder.Append(input[i]);
           if (i % 2 == 1)
           {
              stringBuilder.Append("|");
           }
        }
        textBox1.Text = stringBuilder.ToString();
        textBox1.Select(textBox1.Text.Length, 0);
     }
  }

答案 3 :(得分:-1)

请勿按CTRL键。

if (e.Control == true)
{
    MessageBox.Show("Cut/Copy and Paste Options are disabled");
}