コメント |
[[キー イベントは次の順序で発生します]]
@DIV
1.KeyDown
2.KeyPress
3.KeyUp
@END
KeyPress イベントは、文字以外のキーによっては発生しませんが、
文字以外のキーは KeyDown イベントと KeyUp イベントを発生させます。
※ 例えば、Delete は KeyPress では通知されません
[[以下、基本的なキーの受け方]]
@DIV
Public Class Form1
Private Sub TextBox1_KeyDown(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles TextBox1.KeyDown
Console.WriteLine("KeyDown:" + e.KeyCode.ToString())
' Enter
If e.KeyCode = Keys.Enter Then
Console.WriteLine("Enter")
End If
' Delete
If e.KeyCode = Keys.Delete Then
Console.WriteLine("Delete")
End If
End Sub
Private Sub TextBox1_KeyPress(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles TextBox1.KeyPress
Dim b As Byte() = System.Text.Encoding.Unicode.GetBytes(e.KeyChar)
Console.WriteLine("KeyPress:" + b(0).ToString("X"))
' Enter
If e.KeyChar = ControlChars.Cr Then
Console.WriteLine("Enter")
End If
End Sub
Private Sub TextBox1_KeyUp(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles TextBox1.KeyUp
Console.WriteLine("KeyUp:" + e.KeyCode.ToString())
' Enter
If e.KeyCode = Keys.Enter Then
Console.WriteLine("Enter")
End If
' Delete
If e.KeyCode = Keys.Delete Then
Console.WriteLine("Delete")
End If
Console.WriteLine("---------------------")
End Sub
End Class
@END
@DIV
Tab は、画面内の移動キーに使用されているので特殊です
他のフィールドから Tab で移って来た時のみ KeyUp で通知されます
@END
@C:red(
e.Handled = True
)
を KeyPress イベントで設定すると、入力した値がフィールドに表示されなくなります
以下は、イベントの順序を利用して、KeyDown で表示しない文字を決定しています
@DIV
@C:red(Private bCancel As Boolean = False)
Private Sub TextBox1_KeyDown(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles TextBox1.KeyDown
' Aを入力できないようにするフラグを設定する
If e.KeyCode = Keys.A Then
@C:red(bCancel) = True
End If
End Sub
Private Sub TextBox1_KeyPress(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles TextBox1.KeyPress
If @C:red(bCancel) Then
@C:red(e.Handled = True)
@C:red(bCancel) = False
End If
End Sub
@END
@C:red(
フォームの KeyPreview プロパティを True にすると、各フィールドへ通知
する前にフォームにイベントが送られるようになるので、一括でコントロール
が可能になります
)
[[以下はフォーム上のすべての入力フィールドで A が入力できなくなります]]
@DIV
Private Sub @C:red(Form1_Load)|(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.@C:red(KeyPreview) = True
End Sub
Private Sub @C:red(Form1_KeyDown)|(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) _
Handles MyBase.KeyDown
Console.WriteLine("FormKeyDown:" + e.KeyCode.ToString())
' Aを全てのフィールドで入力できないようにするフラグを設定する
If e.KeyCode = Keys.A Then
bCancel = True
End If
End Sub
Private Sub @C:red(Form1_KeyPress)|(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) _
Handles MyBase.KeyPress
Dim b As Byte() = System.Text.Encoding.Unicode.GetBytes(e.KeyChar)
Console.WriteLine("FormKeyPress:" + b(0).ToString("X"))
If bCancel Then
e.Handled = True
bCancel = False
End If
End Sub
@END
[[ユーザーコントロールを作成しての実装例]]
@DIV
' ******************************************************
' 対象文字列以外は入力不可にする
' ******************************************************
Private Sub LboxText_KeyPress(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
' YYYY/MM/DD と先行ゼロは仕様的に数字入力
If Me._DataType = 1 Or Me._DataType = 2 Then
If (ControlChars.Back + _
"0123456789").IndexOf(e.KeyChar.ToString()) < 0 Then
e.Handled = True
Else
Return
End If
End If
' 正の数以外が仕様に加わった時の為に処理を分ける
If Me._DataType = 3 Then
If (ControlChars.Back + _
"0123456789").IndexOf(e.KeyChar.ToString()) < 0 Then
e.Handled = True
Else
Return
End If
End If
If Me._AllowChar <> "" Then
If (ControlChars.Back + _
Me._AllowChar).IndexOf(e.KeyChar.ToString()) < 0 Then
e.Handled = True
End If
End If
End Sub
@END
[[以下は DataType プロパティの定義]]
@DIV
Private _DataType As Integer = 0
<System.ComponentModel.Description( _
"DataTypeの値がデフォルトの場合のみ" & Chr(10) & _
" DataTypeJで変更できます" & Chr(10) & _
"0:文字列" & Chr(10) & _
"1:YYYY/MM/DD" & Chr(10) & _
"2:先行ゼロ文字列(長さはMaxLengthで指定)" & Chr(10) & _
"3:カンマ編集(String.Formatで使用する文字列を EditFormat で指定)" _
), _
System.ComponentModel.DefaultValue(0)> _
Public Property DataType() As Integer
Get
Return _DataType
End Get
Set(ByVal value As Integer)
_DataType = value
End Set
End Property
@END
[[文字列の場合の入力制限プロパティ]]
@DIV
' ******************************************************
' カスタム入力制限
' ******************************************************
Private _AllowChar As String = ""
<System.ComponentModel.Description("セットした文字列のみ入力可能とする"), _
System.ComponentModel.DefaultValue("")> _
Public Property AllowChar() As String
Get
Return _AllowChar
End Get
Set(ByVal value As String)
_AllowChar = value
End Set
End Property
@END
|