DOBON.NET DOBON.NETプログラミング掲示板過去ログ

TextBox の文字種による入力制限

環境/言語:[VB.NET .NET Framework1.1]
分類:[.NET]

TextBoxから派生させたユーザーコントロールを作成しているのですが、
「数字のみOK」「半角文字のみOK」というような制限をかけているの
ですが、「半角文字のみOK」という場合に、全角文字をIMEで入力する
とそのままOKとなってしまうことを抑制しようと試みています。

IMEで全角文字を入力すると、ちゃんとKeyPressイベントに飛んできま
すし、その文字が全角文字であるかの判定も問題なく e.Handled = True
としてもいます。
ですが、何故か画面上には入力した全角文字が残ってしまいます。

もうこれはどうしようもないのでしょうか?

----------- ここからは余談です ----------------
また、テキストボックスに対して CTRL+V などで貼り付けを行った場合
には KeyPress イベントは無視されるでしょうから、これも考えると
TextChanged イベントに一本化すべきなのかとも思っております。
皆様はどのように対応されていらっしゃいますか?
■No5210に返信(TJさんの記事)
> TextBoxから派生させたユーザーコントロールを作成しているのですが、
> 「数字のみOK」「半角文字のみOK」というような制限をかけているの
> ですが、「半角文字のみOK」という場合に、全角文字をIMEで入力する
> とそのままOKとなってしまうことを抑制しようと試みています。
>
> IMEで全角文字を入力すると、ちゃんとKeyPressイベントに飛んできま
> すし、その文字が全角文字であるかの判定も問題なく e.Handled = True
> としてもいます。
> ですが、何故か画面上には入力した全角文字が残ってしまいます。
> もうこれはどうしようもないのでしょうか?

そう、Windowsの仕様です。

> ----------- ここからは余談です ----------------
> また、テキストボックスに対して CTRL+V などで貼り付けを行った場合
> には KeyPress イベントは無視されるでしょうから、これも考えると
> TextChanged イベントに一本化すべきなのかとも思っております。
> 皆様はどのように対応されていらっしゃいますか?

私は両方やってます。
私はTextBoxを継承した自作コントロールで、Permというプロパティを自作して
コントロール側で、色々規制しています。
プロパティをStructPerm型にしてやってますです。

参考までに、(Newする必要がないので、Staticメソッドでやってます)

Public Structure StructPerm
  Public Shared TypeX   As String
  Public Const Type9   As String = "0123456789"
  Public Const TypeZ9  As String = "0123456789,"
  Public Const TypeS9  As String = "0123456789,+-"
  Public Const TypeZ9V9 As String = "0123456789,."
  Public Const TypeS9V9 As String = "0123456789,.+-"
  Public Const TypeDate As String = "0123456789/"
  Public Const TypeN   As String = "全角文字タイプ"
  Private    Tag    As String

  Shared Sub New()
    Dim iRoma As Integer
    Dim iKana As Integer

    ' Shift-JIS ローマ字の取得
    For iRoma = &H20 To &H7E
      TypeX &= Chr(iRoma)
    Next iRoma

    ' Shift-JIS 半角カナの取得
    For iKana = &HA1 To &HDF
      TypeX &= Chr(iKana)
    Next iKana
  End Sub

  Public Shared GetDeleteNotPermString(ByVal nText As String, ByVal nPerm As String) As String
    Dim iPlace As Integer

    ' ブランクの場合は終了
    If nText = "" Then Return ""
    If nPerm = "" Then Return nText

    ' Nタイプ(全角文字)の場合
    If nPerm = Perm.TypeN Then
      Return StrConv(nText, vbStrConv.Wide).Replace("\", "¥")
    End If

    ' 非許可文字があればデリる
    While (iPlace <> nText.Length)
      If nPerm.IndexOf(nText.Chars(iPlace)) < 0 Then
        nText = nText.Substring(0, iPlace) & nText.Substring(iPlace + 1)
      Else
        iPlace += 1
      End If
    End While

    ' 非許可文字を削った文字列を返す
    Return nText
  End Function
End Structure

# 汚らしい、長文ソース貼り付けごめんなさい。
> Public Shared GetDeleteNotPermString(ByVal nText As String, ByVal nPerm As String) As String

うう、Functionが抜けてる…。

Public Shared Function GetDeleteNotPermString(ByVal nText As String, ByVal nPerm As String) As String

です…バカでスイマセン…。

DOBON.NET | プログラミング道 | プログラミング掲示板