この例で説明しましょう。次のマスクを持つ MaskedTexBox があるとします。__-__-____
これは、形式の日付のマスクmm-dd-yyyy
です。
最初の位置では、有効な月のエンティティのみが 0 または 1 になります。
この部分は、ユーザーが 2 から 9 を押すと、自動的に MaskedTextBox = 02-__-____
or 03-__-____
or 04-__-____
...09-__-____
などを作成するように作業する必要がありました。
それがどのように機能するかを見て、私は次の位置に移動しようとしました. 2 桁目の有効なエントリは、最初の桁が 0 の場合は 1 ~ 9、最初の桁が 1 の場合は 0 ~ 2 のみです。
しかし、最初の位置で最初の数字を押すと、2 番目の位置が正しく設定されます。しかし、ユーザーが 2 番目の位置でバックスペースまたはクリックして 0 を押した場合、最初の位置に既に 0 が含まれている場合、ユーザーが 0 を押せないようにしたいと考えています00-__-____
。 .
「日」の位置 (3 番目と 4 番目) では、3 番目は 0、1、2、3 のみを入力できるようにする必要があります。
位置 4 のロジック:
3 番目が 0 の場合、位置 4 は 1 ~ 9 のみを許可できます
3 番目が 1 または 2 の場合、位置 4 は 0 ~ 9 のみを許可できます
3 番目が 3 の場合、位置 4 は 0-1 のみを許可できます
「年」の位置 (5 番目、6 番目、7 番目、8 番目) にも独自のロジックがあります。しかし、この質問が複雑になったり混乱したりするのを防ぐために、誰かがそれを求めない限り、そのロジックを投稿することは控えます.
基本的に、MaskedTextBox 文字列内の各位置には、従う必要がある独自のロジックがあります。以下のコードを試しましたが、ユーザーが上記の位置に無効な数字を入力するのを防ぐことができませんでした。ユーザーが不要な文字を入力/入力するのを防ぐことがわかった他の例には、 IF/ELSE 句が 1 つだけで、 1e.Handled = false
と 1しかないため、このようなことができないのではないかと考え始めていましたe.Handled = true
。私の場合は、深い IF/ELSE 句に多くを配置する必要があります。
これは KeyPress イベントを使用して C# でも可能ですか?
これまでに試したコード。私は運がない多くのオプションを試してきたので、混乱を許してください。月と日の部分を最初に機能させたかったため、以下のコードの「年」ロジックは完了していません。
private void mtbTest_KeyPress(object sender, KeyPressEventArgs e)
{
Char pressedKey = e.KeyChar;
mtbTest.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
int[] formatLengths = { 0 };
if (Char.IsNumber(pressedKey))
{
if (formatLengths.Contains(mtbTest.Text.Length) && Convert.ToInt32(Char.GetNumericValue(pressedKey)) > 1)
{
mtbTest.Text = String.Format("{0}0", mtbTest.Text);
}
if (mtbTest.Text.Length == 1)
{
if (Convert.ToInt32(mtbTest.Text.Substring(0, 1)) == 0)
{
if (Convert.ToInt32(Char.GetNumericValue(pressedKey)) > 1)
{
e.Handled = false;
}
}
if (Convert.ToInt32(mtbTest.Text.Substring(0, 1)) == 1)
{
if (Convert.ToInt32(Char.GetNumericValue(pressedKey)) < 2)
{
e.Handled = false;
}
}
}
if (mtbTest.Text.Length == 2 && Convert.ToInt32(Char.GetNumericValue(pressedKey)) > 3)
{
mtbTest.Text = String.Format("{0}0", mtbTest.Text);
}
if (mtbTest.Text.Length == 3)
{
if (Convert.ToInt32(mtbTest.Text.Substring(2, 1)) == 0)
{
if (Convert.ToInt32(Char.GetNumericValue(pressedKey)) > 0)
{
e.Handled = false;
}
}
}
if (mtbTest.Text.Length == 4 && Convert.ToInt32(Char.GetNumericValue(pressedKey)) > 1)
{
e.Handled = false;
}
e.Handled = true;
}
else
{
e.Handled = true;
}
mtbTest.TextMaskFormat = MaskFormat.IncludePromptAndLiterals;
}