产品代码的TextBox - 处理破折号

时间:2017-02-27 09:41:56

标签: c# .net winforms

我有一个TextBox用户打算输入如下所示的产品代码:

XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

我正在尝试做的是在用户输入时自动将破折号放在正确的位置,这样他们只需输入实际的代码本身(类似于各种软件中的内容)。

我遇到的问题与用户输入时光标的位置有关。

我目前的解决方案(部分工作)如下:

private void textBoxProductKey_KeyPress(object sender, KeyPressEventArgs e)
{
    if (char.IsControl(e.KeyChar))
    {
        return;
    }

    if (!char.IsLetterOrDigit(e.KeyChar) || textBoxProductKey.Text.Length == 29)
    {
        e.Handled = true;
        return;
    }

    var cursorPosition = textBoxProductKey.SelectionStart;
    string text;

    if (cursorPosition == 0)
    {
        text = e.KeyChar + textBoxProductKey.Text;
    }
    else if (cursorPosition == textBoxProductKey.Text.Length)
    {
        text = textBoxProductKey.Text + e.KeyChar;
    }
    else
    {
        text = textBoxProductKey.Text.Insert(cursorPosition, e.KeyChar.ToString());
    }

    text = Regex.Replace(text, "-", "");
    text = Regex.Replace(text, ".{5}", "$0-");
    textBoxProductKey.Text = text.Length <= 29 ? text : text.Substring(0, 29);

    textBoxProductKey.SelectionStart = cursorPosition / 6 == (cursorPosition + 1) / 6
        ? cursorPosition + 1
        : cursorPosition + 2;

    e.Handled = true;
}

我当前解决方案的两个问题是

  • 它无法正确处理删除/退格键,可能需要删除/插入不同位置的短划线并重新计算光标位置
  • 如果cursorPosition == textBoxProductKey.Text.Length
  • ,它无法正常工作

后者很容易修复,但我正在与前者挣扎,并且觉得代码有点复杂。

如何更轻松地实现此目标(请注意,计划是继续使用TextBox对象)。

修改

我知道MaskedTextBox控件,我不想使用MaskedTextBox,我想使用TextBox

我想做的事情并不在TextBox的可能范围之外,即使有更“简单”的方法可以通过其他控件实现这一点。

此外,我觉得这是一个很好的问题,教会人们如何在TextBox(可能还有其他事情)中使用光标。

2 个答案:

答案 0 :(得分:2)

您是否考虑过使用MaskedTextBox控件?这可能更合适。

MaskedTextBox专为此类要求而设计,可以回答您的原始问题。

您可能会发现使用普通TextBox实现此功能更加困难。同样值得权衡的是哪种解决方案更容易无错误且更易于维护。

如果您能向我们解释为什么您更喜欢在MaskedTextBox上使用TextBox,这可能会有所帮助。

答案 1 :(得分:0)

继续我们的对话,保存当前的插入位置,将整个文本解析为新的,并将插入符号恢复到原始位置。

这样你就可以处理删除和复制粘贴