我有一个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
(可能还有其他事情)中使用光标。
答案 0 :(得分:2)
您是否考虑过使用MaskedTextBox控件?这可能更合适。
MaskedTextBox专为此类要求而设计,可以回答您的原始问题。
您可能会发现使用普通TextBox实现此功能更加困难。同样值得权衡的是哪种解决方案更容易无错误且更易于维护。
如果您能向我们解释为什么您更喜欢在MaskedTextBox上使用TextBox,这可能会有所帮助。
答案 1 :(得分:0)
继续我们的对话,保存当前的插入位置,将整个文本解析为新的,并将插入符号恢复到原始位置。
这样你就可以处理删除和复制粘贴