C# 产品代码文本框-处理破折号
我有一个C# 产品代码文本框-处理破折号,c#,.net,winforms,C#,.net,Winforms,我有一个文本框,用户要在其中输入如下所示的产品代码: XXXXX-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX 我试图做的是在用户键入时自动将破折号放置在正确的位置,这样他们只需输入实际代码本身(类似于在各种软件中所做的) 我遇到的问题与用户键入时光标的位置有关 我目前的解决方案(部分工作)如下: private void textBoxProductKey_KeyPress(object sender, KeyPressEventArgs e) { if (char.Is
文本框
,用户要在其中输入如下所示的产品代码:
XXXXX-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;
}
private void textBoxProductKey\u按键(对象发送者,按键事件参数e)
{
if(char.IsControl(e.KeyChar))
{
返回;
}
如果(!char.isleterordigit(e.KeyChar)| | textBoxProductKey.Text.Length==29)
{
e、 已处理=正确;
返回;
}
var cursorPosition=textBoxProductKey.SelectionStart;
字符串文本;
如果(光标位置==0)
{
text=e.KeyChar+textBoxProductKey.text;
}
else if(cursorPosition==textBoxProductKey.Text.Length)
{
text=textBoxProductKey.text+e.KeyChar;
}
其他的
{
text=textBoxProductKey.text.Insert(cursorPosition,e.KeyChar.ToString());
}
text=Regex.Replace(文本“-”,”);
text=Regex.Replace(text,“.{5}”,“$0-”;
textBoxProductKey.Text=Text.Length您考虑过使用MaskedTextBox控件吗?它可能更合适
MaskedTextBox正是为这种类型的需求而设计的,它将回答您最初的问题
你可能会发现用普通的文本框自己实现这一功能会更加困难。同样值得权衡的是,哪种解决方案更有可能是无bug的,并且更易于维护
如果您能向我们解释为什么您更喜欢使用文本框而不是MaskedTextBox,可能会有所帮助。您是否考虑过使用MaskedTextBox控件?它可能更合适
MaskedTextBox正是为这种类型的需求而设计的,它将回答您最初的问题
你可能会发现用普通的文本框自己实现这一功能会更加困难。同样值得权衡的是,哪种解决方案更有可能是无bug的,并且更易于维护
如果您能向我们解释为什么您更喜欢使用文本框而不是蒙面文本框,这可能会有所帮助。继续我们的对话,保存您当前的插入符号位置,像解析新文本一样解析整个文本,并将插入符号返回到其原始位置
通过这种方式,您可以处理删除和复制粘贴继续我们的对话,保存当前插入符号位置,将整个文本作为新文本进行解析,并将插入符号返回到原始位置
通过这种方式,您可以处理删除和复制粘贴我已经这样做了,并决定不这样做(正如我在问题中提到的,计划是继续使用文本框
对象)。此外,我也不认为这是你在评论中放的东西,而不是答案,因为它根本不回答问题。尽管你做了编辑,但这仍然不是答案,并且在评论部分(此处所属)讨论到了死亡,我不愿意使用MaskedTextBox
。我已经这样做了,并决定不使用它(正如我在问题中提到的,计划是继续使用文本框
对象)。我也不认为这是你在评论中写的那种东西,而不是答案,因为它根本没有回答问题。尽管你做了编辑,但这仍然不是一个答案,并且在评论部分(它所属的地方)已经讨论到了死亡我不愿意使用MaskedTextBox
。MaskedTextBox
可能就是您要找的► - 关于注意,计划是继续使用TextBox对象
——我能说的是,使用正确的工具来完成正确的工作,否则您的自定义代码可能会试图连续解决特定场景的特定问题,…锤子、方钉、圆孔等。我知道MaskedTextBox控件,我不想使用一个屏蔽文本框,我想使用一个文本框。
-当然这是可能的,有很多SO帖子已经向你展示了如何在文本框上实现你自己的屏蔽代码,但是他们都有问题,因此,…使用屏蔽文本框。我也觉得这是一个很好的问题,可以教人们如何在文本框中使用光标文本框
-我不确定通过教用户如何不使用正确的工具来完成正确的工作,以及如何使简单的解决方案过于复杂化来实现这一点是否是正确的方法。您是否尝试过保存以前的文本值?这样您可以在每次更改后按长度和值进行比较-如果用户粘贴文本也很有用。@Fran,正确的t工作的工具就是你自己制作的。如果说一个基本上是文本框的控件,加上验证,比一个更精简的版本要好,就像说没有人应该使用Sockets
,因为有一个TcpClient
@cogumel0-如果你想重新发明轮子,你可以看看de>MaskedTextBox
源代码并复制所需内容► MaskedTextBox
可能就是您要查找的内容► - 关于注意,计划是继续使用TextBox对象
——我能说的是,使用正确的工具来完成正确的工作,否则您的自定义代码可能会试图连续解决特定场景的特定问题,…锤子、方钉、圆孔等。我知道MaskedTextBox控件,我不想使用一个屏蔽文本框,我想使用一个文本框。
-当然这是可能的,有很多SO帖子已经向你展示了如何在一个文本框上实现你自己的屏蔽代码,但是他们都有问题,因此,…使用屏蔽文本框。我也觉得这是一个教体育的好问题