ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
VB.net : キーイベント ( No.0 )
日時: 2010/06/08 12:01
名前: lightbox



  キー イベントは次の順序で発生します
1.KeyDown

2.KeyPress

3.KeyUp
KeyPress イベントは、文字以外のキーによっては発生しませんが、 文字以外のキーは KeyDown イベントと KeyUp イベントを発生させます。 ※ 例えば、Delete は KeyPress では通知されません   以下、基本的なキーの受け方
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
Tab は、画面内の移動キーに使用されているので特殊です
他のフィールドから Tab で移って来た時のみ KeyUp で通知されます
e.Handled = True を KeyPress イベントで設定すると、入力した値がフィールドに表示されなくなります 以下は、イベントの順序を利用して、KeyDown で表示しない文字を決定しています
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
		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 bCancel Then
		e.Handled = True
		bCancel = False
	End If

End Sub
フォームの KeyPreview プロパティを True にすると、各フィールドへ通知 する前にフォームにイベントが送られるようになるので、一括でコントロール が可能になります   以下はフォーム上のすべての入力フィールドで A が入力できなくなります
Private Sub Form1_Load|(ByVal sender As System.Object, _
   ByVal e As System.EventArgs) Handles MyBase.Load

	Me.KeyPreview = True

End Sub

Private Sub 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 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
  ユーザーコントロールを作成しての実装例
' ****************************************************** 
' 対象文字列以外は入力不可にする
' ****************************************************** 
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
  以下は DataType プロパティの定義
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
  文字列の場合の入力制限プロパティ
' ****************************************************** 
' カスタム入力制限
' ****************************************************** 
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