[Tips][MaskedTextBox] まとめ

これまでに紹介した MaskedTextBox コントロールのTipsは下記の通りです。
また
HIRO’s.NETでもご覧いただけます。
ソースコードのダウンロードはこちらからどうぞ。ただしご自身の責任の下でご使用ください。

  1. マスクを設定する
  2. ASCII文字だけを受け入れるようにする
  3. 無効な入力があったときに音を鳴らす
  4. フォーカスを失ったときに、入力マスクのプロンプト文字を非表示にする
  5. テキスト挿入モードを設定する
  6. 入力した文字が見えないようにする
  7. ユーザー入力がないことを表す文字を設定する
  8. 読み取り専用にする
  9. マスクの書式と一致しない文字が入力されたことを検知する
  10. 入力した文字が拒否された理由を知る

[Tips][MaskedTextBox] 入力した文字が拒否された理由を知る

前回の記事で、MaskInputRejectedイベントを使用して入力した文字がマスクと一致しない場合にメッセージを出す方法を紹介しました。

本記事では、マスクに一致しなかった原因を理由を取得する方法について紹介します。

MaskInputRejectedイベントは、引数 e.RejectionHintを持っており、この値を調べることで、マスクと一致しなかった理由を知ることが出来ます。

e.RejectHintの値は下表に示すとおりです。

メンバ名 説明
AlphanumericCharacterExpected 操作が成功しませんでした。英数字以外の入力文字が見つかりました。
AsciiCharacterExpected 操作が成功しませんでした。ASCII 文字セットにはない入力文字が見つかりました。
CharacterEscaped 成功しました。リテラル文字、プロンプト文字、または空白文字がエスケープ文字であったため、操作が正常に行われました。
DigitExpected 操作が成功しませんでした。数字以外の入力文字が見つかりました。
InvalidInput 操作が成功しませんでした。無効な入力文字が見つかりました。
LetterExpected 操作が成功しませんでした。文字ではない入力文字が見つかりました。
NoEffect 成功しました。必要がなかったため主要な操作は実行されませんでした。したがって、副作用は発生しませんでした。
NonEditPosition 操作が成功しませんでした。書式設定された文字列内の現在の位置はリテラル文字です。
PositionOutOfRange 操作が成功しませんでした。指定した位置が対象の文字列の範囲外です。通常、これはゼロ未満の値か、対象の文字列の長さより大きい値です。
PromptCharNotAllowed 操作が成功しませんでした。入力時のプロンプト文字が有効ではありません。原因としては、AllowPromptAsInput プロパティが false に設定されていることが考えられます。
SideEffect 成功しました。必要がなかったため主要な操作は実行されませんでしたが、メソッドで副作用が発生しました。たとえば、RemoveAt メソッドは未割り当ての編集位置を削除できるため、書式設定された文字列で後続文字が左にシフトされます。
SignedDigitExpected 操作が成功しませんでした。符号付き数値以外の入力文字が見つかりました。
Success 成功しました。主要な操作が正常に行われました。
UnavailableEditPosition 操作が成功しませんでした。要求を実行するのに十分な編集位置がありませんでした。
Unknown 不明です。操作の結果を判断できませんでした。

下記は、入力しなかった文字がマスクと一致しなかった場合に、その理由を表示する例です。

VBの例

''' <summary>
''' フォームロード時の処理
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub Form10_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'マスクの設定(数値3桁)
    MaskedTextBox1.Mask = "000"
End Sub

''' <summary>
''' 入力された文字がマスクと一致しない場合
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub MaskedTextBox1_MaskInputRejected(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MaskInputRejectedEventArgs) Handles MaskedTextBox1.MaskInputRejected
    Dim msg As String
    Select Case e.RejectionHint
        Case System.ComponentModel.MaskedTextResultHint.DigitExpected
            msg = "操作が成功しませんでした。" & vbCrLf & "数字以外の入力文字が見つかりました。"
        Case Else
            msg = "その他のエラーが発生しました。"
    End Select

    MessageBox.Show(msg)
End Sub

C#の例

/// <summary>
/// フォームロード時の処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form10_Load(object sender, EventArgs e)
{
    // マスクの設定(数値3桁)
    maskedTextBox1.Mask = "000";
}

/// <summary>
/// 入力された文字がマスクと一致しない場合
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void maskedTextBox1_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
{
    string msg = "";

    switch (e.RejectionHint)
    {
        case MaskedTextResultHint.DigitExpected:
            msg = "操作が成功しませんでした。\r\n数字以外の入力文字が見つかりました。";
            break;
        default:
            msg = "その他のエラーが発生しました。";
            break;
    }

    MessageBox.Show(msg);
}

[Tips][MaskedTextBox] マスクの書式と一致しない文字が入力されたことを検知する

MaskedTextBoxでは、MaskInputRejectedイベントを使用して、入力した文字が設定したマスクの書式と一致しないことを知ることができます。

下記は入力された文字がマスクと一致しない場合にメッセージを表示する例です。

VBの例

'''
''' フォームロード時の処理
'''
''' <param name="sender" />
''' <param name="e" />
'''
Private Sub Form9_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    'マスクの設定(数値3桁)
    MaskedTextBox1.Mask = "000"
End Sub

'''
''' 入力された文字がマスクと一致しない場合
'''
''' <param name="sender" />
''' <param name="e" />
'''
Private Sub MaskedTextBox1_MaskInputRejected(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MaskInputRejectedEventArgs) Handles MaskedTextBox1.MaskInputRejected
    MessageBox.Show("無効な文字が入力されました")
End Sub

C#の例

///
/// 08.読み取り専用にする
///
/// <param name="sender" />
/// <param name="e" />
private void button8_Click(object sender, EventArgs e)
{
    Form8 f8 = new Form8();
    f8.ShowDialog();
}

///
/// 09.マスクの書式と一致しない文字が入力されたことを検知する
///
/// <param name="sender" />
/// <param name="e" />
private void button9_Click(object sender, EventArgs e)
{
    Form9 f9 = new Form9();
    f9.ShowDialog();
}