ユーザー入力をハイフンで区切られたチャンクに自動的に分割する、ある種のライセンス検証テキストボックスを作成しようとしています。私のライセンスは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;
}
これは、ユーザーがボックス内に入力して貼り付けるときに完全に機能します。私の唯一の問題は、ユーザーがバックスペースまたは削除を押して、入力したキーから文字を削除しようとしたときです。
ユーザーがバックスペースでこれらのマークの1つに到達すると、位置5、10、15、20でハイフンが強制的に挿入されるため、上記のロジックを押すと、文字列にハイフンが追加され、ユーザーはそれを超えることはできません。
KeyDownイベントをいじってみましたが、役立つものが見つかりませんでした。誰か助けてくれませんか。
MaskedTextboxも使用してみましたが、フォーカスにマスク/ハイフンを表示したくないので、それは醜いです。プロンプトの内側をクリックすると混乱が生じるため、プロンプトを空白に置き換えたくありません。ボックスは、「おそらく」空の場合、カーソルが常にボックスの先頭に配置されるとは限りません。