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

コンボボックスで数値のみ許可

分類:[.NET]

テキストボックスでの数値のみ許可はKeyPressイベントの文字を指定して
可能になりましたが、同じようにコンボボックスでKeyPressを利用して
英文字を許可しないようにしたいのですが、うまくいきません。
どなたかご教授いただけませんか?
よろしくお願いいたします。
■No47に返信(Yamadaさんの記事)
> テキストボックスでの数値のみ許可はKeyPressイベントの文字を指定して
> 可能になりましたが、同じようにコンボボックスでKeyPressを利用して
> 英文字を許可しないようにしたいのですが、うまくいきません。

テキストボックスの場合と全く同じように出来ると思うのですが...

Private Sub ComboBox1_KeyPress(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles ComboBox1.KeyPress
If e.KeyChar < "0"c Or e.KeyChar > "9"c Then
e.Handled = True
End If
End Sub
> Private Sub ComboBox1_KeyPress(ByVal sender As Object, _
> ByVal e As System.Windows.Forms.KeyPressEventArgs) _
> Handles ComboBox1.KeyPress
> If e.KeyChar < "0"c Or e.KeyChar > "9"c Then
> e.Handled = True
> End If
> End Sub

テキストボックスと同じように、KeyPressイベントにて数値のみ許可とした
ところ、英文字も表示されてしまいます。
If (e.KeyChar >= "0" And e.KeyChar <= "9") Or e.KeyChar = ""c Then
e.Handled = False
Else
e.Handled = True
End If
> テキストボックスでの数値のみ許可はKeyPressイベントの文字を指定して
> 可能になりましたが、同じようにコンボボックスでKeyPressを利用して
> 英文字を許可しないようにしたいのですが、うまくいきません。

いろいろ検証した結果、テキストボックスとコンボボックスでは
イベントの呼び出し順?が異なるようです。
コンボボックスでKeyPressイベント内でコンボボックスのテキストを
取得すると、すでに文字が入力されています。
したがって、今回はKeyPressイベントの中で余分な英文字を削除
するようにしました。
ありがとうございました。

Dim intSelStart As Integer = ComboBox1.SelectionStart
Const STR_KEYCHAR_0 as String = "0"
Const STR_KEYCHAR_9 as String = "9"
Const STR_KEYCHAR_BS as String = "\B"

'数値とバックスペースのみ有効
If (e.KeyChar >= STR_KEYCHAR_0 And e.KeyChar <= STR_KEYCHAR_9) Or  e.KeyChar = STR_KEYCHAR_BS Then
Else
     'テキストの入力位置から無効な文字を削除
    If (ComboBox1.SelectionStart > 0) Then
            ComboBox1.Text = ComboBox1.Text.Substring(0, ComboBox1.SelectionStart - 1) 
        & ComboBox1.Text.Substring(ComboBox1.SelectionStart)
        Else
                   ComboBox1.Text = ComboBox1.Text.Substring(ComboBox1.SelectionStart)
        End If
        'テキストの入力位置を修正
        If intSelStart > 0 Then
                  ComboBox1.SelectionStart = intSelStart - 1
        End If
End If
解決済み!
■No58に返信(Yamadaさんの記事)
> > テキストボックスでの数値のみ許可はKeyPressイベントの文字を指定して
>>可能になりましたが、同じようにコンボボックスでKeyPressを利用して
>>英文字を許可しないようにしたいのですが、うまくいきません。
>
> いろいろ検証した結果、テキストボックスとコンボボックスでは
> イベントの呼び出し順?が異なるようです。
> コンボボックスでKeyPressイベント内でコンボボックスのテキストを
> 取得すると、すでに文字が入力されています。
> したがって、今回はKeyPressイベントの中で余分な英文字を削除
> するようにしました。

私のところでは前に紹介したコードで問題なく動いているので、不思議でなりません。

「イベントの呼び出し順?が異なる」というのは、KeyPressとTextChangedでしょうか?違うようには見えないのですが...。

#「Const STR_KEYCHAR_BS as String = "\B"」で大丈夫なのでしょうか?
> 私のところでは前に紹介したコードで問題なく動いているので、不思議でなりません。

私の検証した結果は、KeyPressイベントでTextプロパティをDebugで
確認すると、今押したKeyの英文字が入っています。
したがって、e.Handleに無効の値を返却してもコンボボックスには
表示されています。

> 「イベントの呼び出し順?が異なる」というのは、KeyPressとTextChangedでしょうか?違うようには見えないのですが...。
テキストボックスのKeyPressイベントでTextプロパティをDebugで
確認すると、今押したKeyの英文字は入っていません。
なぜでしょうか?

>
> #「Const STR_KEYCHAR_BS as String = "\B"」で大丈夫なのでしょうか?
これは、だめですね。
Charの中身は表現できない文字でした・・・。
大変失礼しました。

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