我正在尝试创建某种许可证验证文本框,该文本框会自动将用户输入拆分为由连字符分隔的块。我的许可证有 25 个字符长,它是这样分开的:
XXXXX-XXXXX-XXXXX-XXXXX-XXXXX
我想出了以下代码来解析用户输入,而他正在键入或通过复制/粘贴通过处理TextChanged
文本框控件的事件,如下所示:
public static string InsertStringAtInterval(string source, string insert, int interval)
{
StringBuilder result = new StringBuilder();
int currentPosition = 0;
while (currentPosition + interval < source.Length)
{
result.Append(source.Substring(currentPosition, interval)).Append(insert);
currentPosition += interval;
}
if (currentPosition < source.Length)
{
result.Append(source.Substring(currentPosition));
}
return result.ToString();
}
private bool bHandlingChangeEvent = false;
private void txtLicense_TextChanged(object sender, EventArgs e)
{
if (bHandlingChangeEvent == true)
return;
bHandlingChangeEvent = true;
string text = txtLicense.Text.Replace("-", "").Replace(" ","");
int nPos = txtLicense.SelectionStart;
if((text.Length==5||text.Length==10||text.Length==15||text.Length==20) && txtLicense.Text[txtLicense.Text.Length-1]!='-')
{
txtLicense.Text += "-";
txtLicense.SelectionStart = nPos + 1;
}
if(text.Length>=25)
{
string tmp = text.Substring(0, 25);
tmp = InsertStringAtInterval(tmp, "-", 5);
txtLicense.Text = tmp;
txtLicense.SelectionStart = nPos;
}
bHandlingChangeEvent = false;
}
当我用户在框内键入和粘贴时,这工作得很好。我唯一的问题是,当用户尝试通过按退格键或删除键从输入的键中删除字符时。
由于强制连字符插入@位置 5,10,15,20 一旦用户在退格键上达到这些标记之一,上面的逻辑会强制将连字符添加到字符串中,并且用户不能超出此范围。
我尝试摆弄 KeyDown 事件,但想不出任何有用的东西。有人可以帮忙吗?
我也尝试过使用 MaskedTextbox,但这很丑,因为我不希望掩码/连字符在焦点上可见,而且我当然不想用空格替换提示,因为在单击内部时会产生一些混乱当“假定”为空时,作为光标的框并不总是位于框的开头。